Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript中使用提升_Javascript - Fatal编程技术网

在Javascript中使用提升

在Javascript中使用提升,javascript,Javascript,js完成吊装后,代码将如何处理? JSFIDLE显示它打印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()

js完成吊装后,代码将如何处理? JSFIDLE显示它打印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);

经过一些实验,我得出结论,使用相同的全局变量和局部函数名会混淆JS引擎

因此,通过
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

经过一些实验,我得出结论,使用相同的全局变量和局部函数名会让JS引擎感到困惑

因此,通过
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;                      //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
不一样。我相信这是很明显的

这里没有什么令人困惑的。将所有声明移到顶部,代码如下所示:

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
不一样。我相信这是很明显的

这是预期的行为

var a = 1;
function b() {
    a = 10;
    return;
    function a() {}
}
b();
alert(a);
这一切都与定义函数的范围和时间有关。首先用代码词function声明函数

function a(){};
将在解析时将函数添加到作用域中。也就是说,它是在b()中的第一行之前定义的。令人高兴的是,您将a定义为loal变量b中。这将使全局变量a无法从b中访问a将在b范围内本地定义和操作,并保持全局a不变

将使用等效代码

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

这是预期的行为

var a = 1;
function b() {
    a = 10;
    return;
    function a() {}
}
b();
alert(a);
这一切都与定义函数的范围和时间有关。首先用代码词function声明函数

function a(){};
将在解析时将函数添加到作用域中。也就是说,它是在b()中的第一行之前定义的。令人高兴的是,您将a定义为loal变量b中。这将使全局变量a无法从b中访问a将在b范围内本地定义和操作,并保持全局a不变

将使用等效代码

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

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

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

一个街区是不可能的 定义新的执行范围。仅程序和函数声明 产生一个新的范围


这很有希望地解释了为什么您所包含的代码是这样工作的——没有“代码在提升后的表现方式”,只是对JavaScript中scope的工作方式有一个简单的(也是常见的)误解。

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

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

一个街区是不可能的 定义新的执行范围。仅程序和函数声明 产生一个新的范围


这很有希望地解释了为什么您所包含的代码是这样工作的——没有“代码在提升后的表现方式”,只是对JavaScript中scope的工作方式有一个简单的(也是常见的)误解。

您想做什么achieve@johnSmith当前位置我相信他想知道为什么
alert(a)
显示的是
1
而不是
函数a(){}
。当然
a
将是1,因为
a
内部与
a
外部不同。您想要什么achieve@johnSmith:我想他想知道为什么
警报(a)
显示
1
而不是
函数a(){}
。当然
a
将是1,因为
a
内部与
a
外部不同。如果在“b”函数的开头添加以下警报:“警报(a);”和“警报(window.a);”您将看到这个答案似乎是正确的……如果在“b”函数的开头添加以下警报:“警报(a);”和“警报(窗口a);“您将看到这个答案似乎是正确的……var b=function(){}与function b()完全不同。函数表达式不会被提升,而函数声明将被提升。@kheya-将它们全部移动到顶部后它们是相同的。因此
function b()
var b=function()
完全相同。它们在浏览器内部代码中的作用完全相同,只是后者没有设置
b.name
。您可以阅读更多关于t