在功能范围上混淆行为

时间:2014-07-16 11:39:41

标签: javascript scope

我是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”?

4 个答案:

答案 0 :(得分:3)

  

它只输出四次

您的console.log个语句中有两个在lf函数中,您从不调用它。

  

为什么" il"第一次给出未定义的

var语句被悬挂。

var of = function(){
    console.log(o + " " + il);
    o = "baher";
    var il = "ander";

本节的最后一行在函数范围内创建一个局部变量il。由于它已被提升,因此只要输入该功能就会发生这种情况。

第二行读取该局部变量的值,但尚未为其分配值,因此它为undefined

然后第三行为其赋值。

答案 1 :(得分:2)

首先,仅为功能创建新范围。像whileif这样的条件块不会创建新范围。

其次,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)

  1. 代码在功能块内部有var il = "ander";,所以它会在调用之前将代码记录下来,因此它未定义。

  2. 在你的嵌套函数中也是如此,但在此之前它是嵌套函数,所以它采用了父函数中定义的ander的值。

答案 3 :(得分:0)

ilundefined的原因是它在函数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);