[英]Closures - Javascript
因为回调的行为就像实际上是放在函数内部一样,所以它们实际上是闭包的:它们可以访问包含函数的变量和参数,甚至可以访问全局作用域链接中的变量。 对? 但是如果我这样做:
function fullName(firstName, lastName, callback){
var f_scope = "X";
console.log("My name is " + firstName + " " + lastName);
callback(lastName);
}
var greeting = function(ln){
console.log('Welcome Mr. ' + ln);
console.log(f_scope);//<<---error
};
fullName("Jackie", "Chan", greeting);
另一方面,如果greeting
在fullName
内,则不会发生此错误。 因此,回调是否不是100%像放置在函数内部一样? 对?
因为回调的行为就像实际上是放在函数中一样
在函数内部定义的回调的行为就像在函数内部定义的一样。 在函数外部定义的回调的行为就像在函数外部定义的一样。
他们实际上是关闭
从理论上和实践上讲,它们都是闭包。 不同的是它们结束了什么。
var x = 1;
function externalCallback() {
// closes over x, someFunction, externalCallback
}
function someFunction() {
var y = 2;
var internalCallback = function() {
// closes over x, someFunction, externalCallback, internalCallback, y
}
setTimeout(externalCallback, 0);
setTimeout(internalCallback, 0);
}
看一下这个例子:
function callback_caller(callback) {
var x = 7;
callback();
}
function func1() {
var y = 9;
function inner_func() {
// console.log('x', x); // <-- this would not work
console.log('y', y); // <-- this is ok
}
return inner_func;
}
var callback = func1();
callback_caller(callback); // prints: y 9
在调用inner_func
时,包含变量y
func1
早已消失,但是inner_func
仍然可以访问它。 那是因为y
在闭包中。
另一方面, x
与inner_func
无关,并且在那里永远不可用。
fullName在根上下文中,因此它可以看到自己并“打招呼”。
然后,fullName创建“ f_scope”,它仅在fullName内部可见。
根上下文使用firstName,lastName,callback调用fullName。 由于params是函数的本地/私有变量,因此firstName和lastName仅在fullName上下文内部可用。
然后,fullName调用回调,该回调接受一个参数ln,后者恰好是fullName中的lastName参数/变量,但这是作为参数传递的,而不是直接访问。
f_scope是fullName专用的,因此,不能在greeting中调用它,如果将其设为函数的参数,则可以将其传递给greeting。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.