使用闭包在回调中确定params的范围

时间:2015-09-30 19:39:58

标签: javascript callback closures

我知道有很多关于这个主题的问题,但我对两个特定场景之间的区别感兴趣。这是

情景1

y

情景2

   //Global Scope
var a=1, b =2;

var callBackFn = function(param3,param4){
    alert(a);             //1  -->defined
    alert(b);             //2  -->defined
    alert(param1);        //3  -->? 
    alert(param2);        //4  -->? 
    alert(param3);        //5  -->defined 
    alert(param4);        //6  -->defined
    alert(localVariable); //7  -->?
}


var classObj = {

    someMemberFunction: function(param1, param2{
        var localVariable; 
        return $.AsyncCallFn(param1, param2).then(function(){
           callBackFn(3,4);
        });
    }

};

classObj.someMemberFunction(5,6);

警报#1到#6的输出是什么? 更重要的是情景1和情景2会有所不同。

根据我在场景1中的理解,callBackFn对param1,param2和localVariable一无所知,因为它不是在someMemberFunction中创建的。但对于场景2,someMemberFunction是否应该不知道param1,param2和localVariable,因为它是someMemberFunction中的一个闭包?

由于

1 个答案:

答案 0 :(得分:-1)

JavaScript有lexical scope。因此,函数(闭包)可以访问在其定义的范围内 visible 的所有变量。

示例1

// This is the global scope
// foo is visible in global scope
var foo = 42;

// bar is defined in global scope, hence it can access foo
function bar() {
   console.log(foo);
}

示例2

// This is the global scope
// foo is visible in global scope
var foo = 42;

// bar is defined in global scope, hence it can access foo
function bar(baz) { // baz is defined in the local scope of bar

   // innerFunction is defined in the local scope of bar
   // hence it has access to baz and foo
   function innerFunction() {
       console.log(foo, baz);
   }
}

应用于您的示例:

在方案1中,callbackFn在范围(全局)中定义,其中abclassObj(以及callbackFn本身)已定义。因此,在callbackFn内,abclassObjparam3param4都可以访问。

在方案2中,回调函数在范围(someMemberFunction)中定义,其中abclassObj可见且param1和{ {1}}已定义。因此,在回调中,param2abclassObjparam1param2param3都可以访问。< / p>