Javascript关闭澄清?

Roy*_*mir 5 javascript closures

正如我读过的文章一样多,我仍然有一些问题.

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

  1. 臭名昭着的循环问题(带有保持号码的每个警报的链接循环)

  2. 增加计数器(继续调用函数 - >警告增加的数字)

这里:

引用其外部函数的局部变量的内部函数创建闭包

这里:

闭包是函数的局部变量 - 在函数返回后保持活动状态,或者闭包是函数返回时未释放的堆栈帧.(好像'stack-frame'是malloc'ed而不是堆栈!)

3个问题请:

问题#1

我被告知JS中的所有函数都创建了Closures.

什么 ??? 如果我用私有变量创建一个普通函数,它只是创建一个范围.没有关闭.

我认为关闭工作是这样的:( 从这里)

  1. 制作一个外部的"功能制造者"功能.
  2. 在其中声明一个局部变量.
  3. 在外部函数内声明一个内部函数.
  4. 在内部函数中使用外部函数的变量.
  5. 具有外部函数返回内部函数
  6. 运行该函数,并将其返回值赋给变量

exmample:

function functionMaker(){
   var x = 1;
   function innerFunction(){
     alert(x);
     x++;
   }
   return innerFunction;
}
Run Code Online (Sandbox Code Playgroud)

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

问题2

是否Self-Invoking FunctionsIEFA - Immediately Invoked Function Expression创建一个闭包?

看着

(function (a) {
    alert(a);
})(4);
Run Code Online (Sandbox Code Playgroud)

我没有看到像上面的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();
Run Code Online (Sandbox Code Playgroud)

是否myFunction还活着,全日在这里?或者它在结束后很快就结束了setTimeout?如果是这样,怎么SetTimeOut 记得这个价值?

请帮我把它弄好.

Poi*_*nty 8

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

如果我执行立即执行的功能:

var value = (function() {
  return 4;
})();
Run Code Online (Sandbox Code Playgroud)

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

var value = function() {
  var counter = 0;
  return function() {
    return counter++;
  };
}();
Run Code Online (Sandbox Code Playgroud)

闭包在紧接着执行的函数之后继续存在,因为它返回另一个函数,该函数又包括对原始函数中定义的"计数器"符号的引用.因为返回的函数仍然是"活动的",所以闭包必须由运行时系统保留.

请注意这里:

var value = function() {
  return function(a) {
    return "hello " + a;
  };
}();
Run Code Online (Sandbox Code Playgroud)

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

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

  • @WaleedKhan不,那不是真的.只需要消除'function`关键字的歧义.在`=`表达式的右侧没有歧义,因此括号不是必需的. (2认同)