我是javascript的新手,当我练习范围时,我尝试了以下代码:
var il = "inner";
var o ="outer";
var of = function(){
console.log(o + " " + il);
o = "baher";
var il = "ander";
console.log(o + " " + il);
var lf = function(){
console.log(o + " " +il);
o = "mazed baher";
var il = "mazed ander";
console.log(o + " " +il);
};
console.log(o + " " +il);
};
of();
console.log(o + " " + il);
////////////////////////////////////// 它的输出很惊人
"outer undefined"
"baher ander"
"baher ander"
"baher inner"
我无法理解这段代码。我使用了console.log
6次,只获得了4次输出。为什么在第一个日志中未定义“il”?
答案 0 :(得分:3)
它只输出四次
您的console.log
个语句中有两个在lf
函数中,您从不调用它。
为什么" il"第一次给出未定义的
var
语句被悬挂。
var of = function(){
console.log(o + " " + il);
o = "baher";
var il = "ander";
本节的最后一行在函数范围内创建一个局部变量il
。由于它已被提升,因此只要输入该功能就会发生这种情况。
第二行读取该局部变量的值,但尚未为其分配值,因此它为undefined
。
然后第三行为其赋值。
答案 1 :(得分:2)
首先,仅为功能创建新范围。像while
和if
这样的条件块不会创建新范围。
其次,JS中的变量定义将始终在范围之上取消。因此,当您通过var
创建变量时,它实际上会在范围之上定义并初始化为undefined
。
console.log(o + " " + il);
o = "baher";
var il = "ander";
在给定的示例中,本地il
将覆盖外部作用域的il
。所以,它看起来像这样:
var il; // undefined
console.log(o + " " + il);
o = "baher"; // outer scope
il = "ander"; // inner scope
答案 2 :(得分:0)
代码在功能块内部有var il = "ander";
,所以它会在调用之前将代码记录下来,因此它未定义。
在你的嵌套函数中也是如此,但在此之前它是嵌套函数,所以它采用了父函数中定义的ander的值。
答案 3 :(得分:0)
il
为undefined
的原因是它在函数of
内被重新声明,并且声明被提升到函数的顶部(但不是赋值) 。请参阅下面的代码,看看我的意思。我还展示了其他变量声明如何被提升。
两个日志语句未运行的原因是函数lf
从未被调用。
var il = undefined;
var o = undefined;
var of = undefined;
il = "inner";
o ="outer";
of = function(){
// il gets hoisted
var il = undefined;
var lf = undefined;
console.log(o + " " + il);
o = "baher";
il = "ander";
console.log(o + " " + il);
// this function is never called
lf = function(){
var il = undefined;
console.log(o + " " +il);
o = "mazed baher";
il = "mazed ander";
console.log(o + " " +il);
};
console.log(o + " " +il);
};
of();
console.log(o + " " + il);