首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用闭包的回调中参数的作用域

使用闭包的回调中参数的作用域
EN

Stack Overflow用户
提问于 2015-10-01 03:39:58
回答 1查看 36关注 0票数 1

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

场景1

代码语言:javascript
复制
   //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);

场景2

代码语言:javascript
复制
    //Global Scope
var a=1, b =2;

var classObj = {

    someMemberFunction: function(param1, param2){
        var localVariable; 
        $.AsyncCallFn(param1, param2).then(function(param3,param4){
            alert(a);             //1  -->?
            alert(b);             //2  -->?
            alert(param1);        //3  -->? 
            alert(param2);        //4  -->? 
            alert(param3);        //5  -->? 
            alert(param4);        //6  -->? 
            alert(localVariable); //7  -->?
        });
    };

}

classObj.someMemberFunction(5,6);

警报#1到#6的输出是什么,更重要的是,在场景1和场景2中会有什么不同吗?

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

谢谢

EN

回答 1

Stack Overflow用户

发布于 2015-10-01 03:50:23

JavaScript有。因此,函数(闭包)可以访问在定义它的作用域中可见的所有变量。

示例1

代码语言:javascript
复制
// 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

代码语言:javascript
复制
// 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可见,并定义了param1param2。因此,在回调函数中,可以访问abclassObjparam1param2param3param4

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32874293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档