dev*_*per 85 javascript scope scoping hoisting
我刚刚阅读了一篇关于Ben Cherry的JavaScript范围和提升的精彩文章,其中他给出了以下示例:
var a = 1;
function b() {
a = 10;
return;
function a() {}
}
b();
alert(a);
Run Code Online (Sandbox Code Playgroud)
使用上面的代码,浏览器将发出"1"警报.
我仍然不确定它为什么会返回"1".他说的一些事情就像是:所有的功能声明都被提升到顶部.您可以使用函数来调整变量的范围.仍然没有为我点击.
Pet*_*son 112
功能提升意味着功能被移动到其范围的顶部.那是,
function b() {
a = 10;
return;
function a() {}
}
Run Code Online (Sandbox Code Playgroud)
将被重复者重写为此
function b() {
function a() {}
a = 10;
return;
}
Run Code Online (Sandbox Code Playgroud)
很奇怪,是吗?
此外,在这种情况下,
function a() {}
Run Code Online (Sandbox Code Playgroud)
表现得一样
var a = function () {};
Run Code Online (Sandbox Code Playgroud)
所以,从本质上讲,这就是代码所做的事情:
var a = 1; //defines "a" in global scope
function b() {
var a = function () {}; //defines "a" in local scope
a = 10; //overwrites local variable "a"
return;
}
b();
alert(a); //alerts global variable "a"
Run Code Online (Sandbox Code Playgroud)
你必须要记住的是它解析整个函数并在执行之前解析所有变量声明.所以....
function a() {}
Run Code Online (Sandbox Code Playgroud)
真的变成了
var a = function () {}
Run Code Online (Sandbox Code Playgroud)
var a 强制它进入局部范围,变量范围是通过整个函数,因此全局变量仍然是1,因为你已经通过使它成为一个函数而声明了一个局部范围.
函数a内部悬挂功能b:
var a = 1;
function b() {
function a() {}
a = 10;
return;
}
b();
alert(a);
Run Code Online (Sandbox Code Playgroud)
这几乎就像使用var:
var a = 1;
function b() {
var a = function () {};
a = 10;
return;
}
b();
alert(a);
Run Code Online (Sandbox Code Playgroud)
该函数在本地声明,并且a只在本地范围内进行设置,而不是全局变量.
| 归档时间: |
|
| 查看次数: |
12582 次 |
| 最近记录: |