Closures - Javascript

Closures - Javascript

本文关键字:Javascript Closures      更新时间:2023-09-26

因为回调的行为就像它们实际上被放在函数中一样,所以它们实际上是闭包:它们可以访问包含函数的变量和参数,甚至可以访问全局范围链接中的变量。正确的但如果我这样做:

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时,包含变量yfunc1早已不在,但inner_func仍然可以访问它。这是因为y在闭包中。

另一方面,xinner_func无关,在那里永远不可用。

fullName位于根上下文中,因此它可以看到自己和"问候语"。

fullName然后创建"f_scope",它只在fullName内部可见。

根上下文使用firstName、lastName和callback调用fullName。firstName和lastName仅在fullName上下文中可用,因为params是函数的本地/私有变量。

fullName然后调用回调,回调接受一个param,ln,恰好是fullName中的lastName param/变量,但它是作为param传递的,而不是直接访问。

f_scope对fullName是私有的,因此,不能在greeting内部调用它,如果将其作为函数的参数,则可以将其传递给greeting。