原文地址:Segmentfault
hoisting机制
javascript的变量声明具有hoisting机制,javascript引擎在执行的时候,会把所有变量的声明都提升到当前作用域的最前面。
例如:
|
|
说明:function作用域里的变量v遮盖了上层作用域变量v
改动代码为:
|
|
说明:javascript是没有块级作用域的。函数是javascript中唯一拥有自身作用域的结构。
声明,定义与初始化
声明宣称一个名字的存在,定义则为这个名字分配存储空间,而初始化则是为名字分配的存储空间赋值,用C++来表达这三个概念
|
|
而在javascript中则是这样
|
|
在函数中使用var关键字进行显式申明的变量是做为局部变量,而没有用var关键字,使用直接赋值方式声明的是全局变量。当我们使用访问一个没有声明的变量时,JS会报错。而当我们给一个没有声明的变量赋值时,JS不会报错,相反它会认为我们是要隐式申明一个全局变量。
声明提升
当前作用域内的声明都会提升到作用域的最前面,包括变量和函数的声明
|
|
变量a,f,b,c的声明会被提升到函数作用域的最前面,类似如下:
|
|
又比如:
|
|
说明:函数表达式并没有被提升,这也是函数表达式与函数声明的区别。
命名函数表达式
可以像函数声明一样为函数表达式指定一个名字,但这并不会使函数表达式成为函数声明。命名函数表达式的名字不会进入名字空间,也不会被提升。
|
|
命名函数表达式的名字只在该函数的作用域内部有效。,因为规范规定了标示符不能在外围的作用域内有效