提升和作用域:
[url=http://blog.segmentfault.com/nightire/1190000000348228]Hoisting & Scoping[/url]\
[url=http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html]Ben cherry的一篇[/url]
[b]第一篇转帖的留言部分:[/b]
关于 Hoisting 那部分,有两点值得说明:
1. Hoisting 的作用范围是随着函数作用域的。我理解在这里尚未讲到函数作用域,不过可以提一句提醒读者注意,然后链接至作用域的部分进一步探讨;
2. “Hoisting 只对 `var` 声明的变量有效”,不尽然如此。变量声明的提升并非 hoisting 的全部,JavaScript 有四种让声明在作用域内获得提升的途径(按优先级):
-语言定义的声明,如 this 和 arguments。你不能在作用域内重新定义叫做 this 的变量,是因为 this 是语言自动定义的声明,并且它的优先级最高,也就是被 Hoisting 到最顶上了,没人能覆盖它
-形式参数。虽然我们无需用 var 来修饰形式参数,但是形式参数的确也是变量,并且被自动提升到次高的优先级
-函数声明。除了 var 以外,function declaration 也可以定义新的命名,并且同样会被 hoisting 至作用域顶部,仅次于前两者
-最后,是本文提到的常规变量,也就是 var 声明的变量
[url=http://blog.segmentfault.com/nightire/1190000000348228]Hoisting & Scoping[/url]\
[url=http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html]Ben cherry的一篇[/url]
[b]第一篇转帖的留言部分:[/b]
关于 Hoisting 那部分,有两点值得说明:
1. Hoisting 的作用范围是随着函数作用域的。我理解在这里尚未讲到函数作用域,不过可以提一句提醒读者注意,然后链接至作用域的部分进一步探讨;
2. “Hoisting 只对 `var` 声明的变量有效”,不尽然如此。变量声明的提升并非 hoisting 的全部,JavaScript 有四种让声明在作用域内获得提升的途径(按优先级):
-语言定义的声明,如 this 和 arguments。你不能在作用域内重新定义叫做 this 的变量,是因为 this 是语言自动定义的声明,并且它的优先级最高,也就是被 Hoisting 到最顶上了,没人能覆盖它
-形式参数。虽然我们无需用 var 来修饰形式参数,但是形式参数的确也是变量,并且被自动提升到次高的优先级
-函数声明。除了 var 以外,function declaration 也可以定义新的命名,并且同样会被 hoisting 至作用域顶部,仅次于前两者
-最后,是本文提到的常规变量,也就是 var 声明的变量