为什么从回调函数返回的函数没有在调用它的函数上形成闭包?

时间:2015-10-08 20:50:59

标签: javascript

我无法理解以下代码的输出(在Javascript中):

function outerFunction(callback){
  var x =10;  
  var myCallbackRet = callback();
  myCallbackRet();     
}

outerFunction(function(){
  return function(){
    console.log(x); //output - x is not defined
  }
});

据我所知,当调用函数myCallbackRet时,myCallbackRet的[[Scope]]属性被设置为outerFunction的Scope链,因此变量{{1应该可以在`myCallbackRet'。

中访问

为什么输出'未定义'?非常感谢。

2 个答案:

答案 0 :(得分:3)

基本上它与定义函数的位置有关。它的定义超出了范围。 Closure仅在某个地方定义函数时才有效。将变量设置为函数并调用它并不会使被调用函数内的所有内容都可用,或者没有理由将参数传递给函数。这样的事情会起作用。

function outerFunction(callback){
    var x =10;  
    var myCallbackRet = callback();
    myCallbackRet(x);     
}

outerFunction(function(){
    return function(y){
        console.log(y);
    }
});

或者这个:

function outerFunction(callback){
    var myCallbackRet = callback();
    myCallbackRet();     
}

outerFunction(function(){
    var x =10;  
    return function(){
        console.log(x);
    }
});

答案 1 :(得分:2)

您的匿名功能 function(){ return function(){ console.log(x) 在与outerFunction相同的范围(全局)上定义,但x在范围outerFunction内定义。

函数的范围是在定义函数时设置的,而不是在将函数赋值给变量的时刻。