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