Javascript范围

时间:2014-10-24 06:03:53

标签: javascript function scope return

为什么以下代码输出4?任何人都可以向我推荐一篇很好的文章来深入学习javascript范围。

这段代码返回4但我不明白为什么?

(function f(){  

return f();    

function f(){
    alert(4);
};    

var f = function (){
    alert(5);
};

})();

但是这段代码片段会返回5.为什么?

(function f(){
var f = function (){
    alert(5);
};
return f();
function f(){
    alert(4);
};
})();

最后一个返回4.我没有得到它。

(function f(){
function f(){
    alert(4);
};
return f();
var f = function (){
    alert(5);
};
})();

为什么return f();不会调用父函数f()?

2 个答案:

答案 0 :(得分:1)

这与范围无关,它与entering an execution context时发生的事情有关。

简而言之,当输入执行上下文(例如函数)时,将创建变量并为其指定undefined值。变量声明如:

var f = 5;

创建变量 f ,但是值5不会被分配,直到运行时并执行该语句。

然后处理函数声明,它有效地创建一个具有该名称的局部变量,并将函数体指定为其值。

然后开始执行。

发生了更多的事情,但这是重要的部分。

以下内容:

// The optional name creates a local variable f at parse time that
// references this function. In some buggy versions of IE, it also creates
// a global f variable that references the function.
(function f(){  

  // This is the only statement in f's execution context that is executed.
  return f();    

  // This defines a function f at parse time, after the variable declaration below,
  // and overriding the initial f created 
  // above, immediately before any code is executed. It is this
  // function that is executed by the return statement
  function f(){
    alert(4);
  };    

  // The variable declaration is processed before the above function declaration
  // and before any code is run. But since f
  // already exists because of the optional name, it has no effect.
  // Since this is below the return, the assignment is never executed. 
  var f = function (){
    alert(5);
  };
})();

适用于其他例子。

(function f(){

  // Everything happens as above, but because this assignment is before the
  // return, it happens after variable function declarations, so when 
  // executed it replaces the function created by the function declaration below.
  var f = function (){
      alert(5);
  };
  return f();

  // This function is created before any code is executed, but is over ridden
  // by the assignment above at runtime
  function f(){
    alert(4);
  };
})();

最后一个:

(function f(){
  function f(){
      alert(4);
  };
  return f();

  // As with the first, this assignment never happens so
  // when f is called above, it calls the function created by 
  // the function declaration.
  var f = function (){
      alert(5);
  };
})();

答案 1 :(得分:0)

以下函数在解析时定义。

function f(){
    //code
};

以下函数在运行时定义。

var f = function(){
    //code
};

在第一个例子中,在解析之后,f的值应该警告4.在返回f()之后写入f的赋值(重写)。因此,分配永远不会发生,最终输出为4。

在第二个例子中,在解析之后,f的值应该警告4.但是在返回f()之前写入f的赋值(重写)。因此最终输出为5。

在第三个例子中,在解析之后,f的值应该警告4.在返回f()之后写入f的赋值(重写)。因此,分配永远不会发生,最终输出为4。