我知道有很多关于这个主题的问题,但我对两个特定场景之间的区别感兴趣。这是
情景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中的一个闭包?
由于
答案 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
在范围(全局)中定义,其中a
,b
和classObj
(以及callbackFn
本身)已定义。因此,在callbackFn
内,a
,b
,classObj
,param3
和param4
都可以访问。
在方案2中,回调函数在范围(someMemberFunction
)中定义,其中a
,b
,classObj
可见且param1
和{ {1}}已定义。因此,在回调中,param2
,a
,b
,classObj
,param1
,param2
和param3
都可以访问。< / p>