【问题标题】:Scoping of params in callbacks with closure带有闭包的回调中的参数范围
【发布时间】:2015-12-28 17:21:42
【问题描述】:

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

场景 1

   //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

    //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 内部的闭包?

谢谢

【问题讨论】:

  • param1param2 定义在哪里?现在这两个例子都不会运行。 JavaScript 有 lexical 范围。这意味着如果您可以访问范围内的变量(例如param1),那么同一范围内的任何定义函数也可以访问它。
  • 抱歉,我现在更新了问题。请您回复警报 1#7 的结果。谢谢

标签: javascript callback closures


【解决方案1】:

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

示例 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 本身)的范围(全局)中定义的。因此在callbackFnabclassObjparam3param4 内部是可以访问的。

在场景 2 中,回调函数在范围 (someMemberFunction) 中定义,其中 abclassObj 可见,param1param2 已定义。因此,在回调内部,abclassObjparam1param2param3param4 是可访问的。

【讨论】:

  • 请解释我的回答有什么问题,谢谢!
  • 我对否决票感到抱歉,但这可能与以下事实有关,即专门询问了这个问题 - “如果 callBackFn 在 2 中定义的方式有所不同场景(在 1# 全局范围和 .then 中的 2# 作为匿名函数),特别是与“param1”、“param2”和“localVariable”的范围有关。您上面描述的是闭包的简单范围概念,这是正确的,但没有回答这个问题。谢谢。
  • 我已经平衡了反对票(通过赞成票):-)
  • 它确实没有直接回答问题,但它提供了得出正确结论所需的所有必要信息。不管怎样,我为那些不能(或不想)自己得出结论的人添加了这些结论。
猜你喜欢
  • 2017-03-07
  • 1970-01-01
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 2020-09-09
  • 1970-01-01
  • 2013-12-29
  • 1970-01-01
相关资源
最近更新 更多