繁体   English   中英

闭包-Javascript

[英]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);

另一方面,如果greetingfullName内,则不会发生此错误。 因此,回调是否不是100%像放置在函数内部一样? 对?

他们可以访问包含函数的变量和参数

词汇包含。 他们可以从定义函数的范围访问变量,而不能从调用函数的范围访问变量。 JS中的函数确实形成词法闭包没有动态作用域

f_scope变量既不是全局变量,也不是在包含greeting的函数中声明的。

因为回调的行为就像实际上是放在函数中一样

在函数内部定义的回调的行为就像在函数内部定义的一样。 在函数外部定义的回调的行为就像在函数外部定义的一样。

他们实际上是关闭

从理论上实践上讲它们都是闭包。 不同的是它们结束了什么。

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在闭包中。

另一方面, xinner_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM