繁体   English   中英

使用Java语言进行吊装

[英]Working with hoisting in Javascript

js完成吊装后的代码将如何显示? jsFiddle显示它可以打印1,但那是真的吗?

var a = 1;
function b() {
    a = 10;
    return;
    function a() {}
}
b();
alert(a);

这是我想出的:

var a;              //hoisted var declaration
function b() {      //hoisted function declaration
    function a() {} //hoisted function declaration
    a = 10;
    return; 
}
a=1;
b();
alert(a);

这是预期的行为。

var a = 1;
function b() {
    a = 10;
    return;
    function a() {}
}
b();
alert(a);

所有这些都与范围和定义函数有关。 首先用代码字函数声明一个函数

function a(){};

将在解析时将函数添加到作用域。 IE在b()的第一行之前定义。 令人高兴的是,您将a定义 b内的loal变量 这将使全局变量b内无法访问。 a将在b的范围内局部定义和操作,而全局a则保持不变。

等效代码将是

var a = 1;
function b() {
    var a = function() {}
    a = 10;
    return;
}
b();
alert(a);

经过一些试验,我得出的结论是,具有相同的Global变量和局部函数名称会使JS Engine感到困惑。

因此,用a = 10所做的事情就是更改了函数声明或其他内容。这不会影响全局变量a。 但是,更改全局变量的名称并将其与内部局部函数保持不同将产生预期的结果:

var c;              //hoisted var declaration
function b() {      //hoisted function declaration
    function a() {alert('in');} //hoisted function declaration
    c = 10;
    return; 
}
c=1;
alert(c); //1
b();
alert(c); //10

在这里查看演示

var a = 1;
function b() {
    a = 10;
    return;
    function a() {}
}
b();
alert(a);

这里没有什么令人困惑的地方。 将所有声明移到顶部,您的代码与以下代码相同:

var a;                      //global a
var b = function(){
    var a = function(){};   //local a
    a = 10;                 //still referring to local a
    return;
};
a = 1;                      //referring to global a
b();
alert(a);                   //referring to global a

这两个a是不一样的。 我相信这很明显。

给出的第一个代码示例似乎与Ben Cherry 足够好的网站上的示例相同。 这将更详细地介绍作用域在JavaScript中的工作方式(主要是-它是功能级的,而不是块级的),并以以下语句结束,该语句直接归因于ECMAScript标准

如果变量语句出现在FunctionDeclaration内部,则将在该函数中使用局部函数作用域定义变量,如10.1.3节所述。 否则,它们将使用属性属性在全局范围内定义(即,它们被创建为全局对象的成员,如10.1.3节中所述)。

...

块未定义新的执行范围。 只有Program和FunctionDeclaration产生新的作用域。

这有希望地解释了您所包含的代码为何按其方式工作-没有“代码在提升后的样子”,对于范围在JavaScript中的工作方式只有一个简单(而且是常见的)误解。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM