gpt4 book ai didi

Javascript 关闭说明?

转载 作者:数据小太阳 更新时间:2023-10-29 06:02:48 25 4
gpt4 key购买 nike

尽管我阅读了那么多文章,但我仍然有一些疑问。

我已经知道(并理解)闭包的用法,例如:

  1. 臭名昭著的循环问题(链接循环,每个链接都有警报,并保留编号)

  2. 增加计数器(继续调用一个函数 -> 提醒增加的数字)

来自 here :

inner functions referring to local variables of its outer function create closures

来自 here :

a closure is the local variables for a function - kept alive after the function has returned, or a closure is a stack-frame which is not deallocated when the function returns. (as if a 'stack-frame' were malloc'ed instead of being on the stack!)

请问3个问题:

问题#1

有人告诉我,JS 中的所有函数都会创建闭包。

什么 ???如果我用私有(private)变量创建一个普通函数,它只会创建一个范围。不是关闭。

我认为闭包是这样工作的:( from here )

  1. Make an outer, "function maker" function.
  2. Declare a local variable inside it.
  3. Declare an inner function inside the outer one.
  4. Use the outer function's variable inside the inner function.
  5. Have the outer function return the inner function
  6. Run the function, and assign its return value to a variable

例子:

function functionMaker(){
var x = 1;
function innerFunction(){
alert(x);
x++;
}
return innerFunction;
}

那么为什么他们说每个 js 函数都会创建闭包?

问题#2

Self-Invoking Functions aka IEFA - Immediately Invoked Function Expression 是否创建闭包?

看着

(function (a) {
alert(a);
})(4);

我没有看到像上面的 6 条规则 这样的模式:Have the outer function return the inner function 到底在哪里?我没有看到 return 这个词。

问题#3

function myFunction() {
  var myVar = 1;
  var alertMyVar = function () {
    alert('My variable has the value ' + myVar);
  };
  setTimeout(alertMyVar, 1000 * 3600 * 24);
}
myFunction();

myFunction 是否在这里存活了一整天?或者它在 setTimeout 之后立即结束?如果是这样,SetTimeOut 是如何记住那个值的?

请帮我把它弄好。

最佳答案

所有函数调用 都会创建一个闭包。需要注意的重要一点是闭包是否持续到函数调用的生命周期之后。

如果我执行一个立即执行的函数:

var value = (function() {
return 4;
})();

然后创建一个闭包,但在函数返回时丢弃。为什么?因为没有幸存的对闭包中定义的符号的引用。但是在这里:

var value = function() {
var counter = 0;
return function() {
return counter++;
};
}();

闭包在立即执行的函数之后继续存在,因为它返回另一个 函数,而该函数又包含对原始函数中定义的“计数器”符号的引用。因为返回的函数仍然“活着”,所以闭包必须由运行时系统保留。

这里注意:

var value = function() {
return function(a) {
return "hello " + a;
};
}();

即使外部立即执行的函数返回一个函数,该函数不引用外部函数的任何符号,因此无需保留闭包。

我想我想说的是,将闭包视为执行函数效果的一部分而不是严格地作为静态的结构性事物是有帮助的。可能有一个函数有时会创建持久闭包,但并非总是如此。

关于Javascript 关闭说明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13495991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com