Javascript闭包

Javascript闭包,javascript,Javascript,下面的程序返回“local”,根据教程Im reading,它旨在演示关闭现象` 我不明白的是,为什么在最后,为了调用parentfunction,它将其赋值给变量“child”,然后调用“child” 为什么仅仅通过编写parentFunction()不起作用;最后呢 var variable = "top-level"; function parentFunction() { var variable = "local"; function childFunction() {

下面的程序返回“local”,根据教程I
m reading,它旨在演示关闭现象`

我不明白的是,为什么在最后,为了调用parentfunction,它将其赋值给变量“child”,然后调用“child”

为什么仅仅通过编写parentFunction()不起作用;最后呢

var variable = "top-level";
function parentFunction() {
  var variable = "local";
  function childFunction() {
    print(variable);
  }
  return childFunction;
}

var child = parentFunction();
child();
parentFunction()返回分配给var child的另一个函数。然后,调用child()调用调用parentFunction()返回的函数

仅运行parentFunction();最后,你不会做任何有用的事情,因为你只会放弃它的返回值,它是一个函数。但这是可行的:

parentFunction()();
看这把小提琴:

更新:一个更简单的例子:

function outer() { // outer function returns a function
    return function() {
        alert('inner function called');
    }
}

x = outer(); // what is now in x? the inner function

// this is the same as saying:
//    x = function() {
//        alert('inner function called');
//    }

x(); // now the inner function is called
看这把小提琴:

JavaScript中的函数可以返回函数(可以返回函数(可以返回函数…)。如果你有一个函数返回另一个函数,那么这意味着当你调用外部函数时,你得到的是内部函数,但它还没有被调用。必须调用作为函数得到的值才能实际运行内部函数体。因此:

x = f();
means—运行函数f并将其返回的内容(可能是字符串、数字、对象、数组或函数)存储在x中。但这是:

x = f()();
means-运行函数f,期望它返回函数,并运行返回的函数(第二个括号),并将返回的函数返回的内容存储在x中

这里的函数f是一个高阶函数,因为它返回另一个函数。函数也可以将另一个函数作为参数。函数式编程语言(尤其是JavaScript)最强大的思想之一是,函数只是可以返回和传递的普通值,如数组或数字

您必须首先掌握高阶函数的概念,才能理解JavaScript中的闭包和事件系统

2016年更新 请注意,目前:

function outer() {
    return function() {
        alert('inner function called');
    }
}
可以写为:

let outer = () => () => alert('inner function called');

使用ES6.

闭包的惊人之处在于内部函数(在本例中为childFunction)可以引用其范围之外的变量(在本例中为variableparentFunction不会返回childFunction的结果,而是函数的实际引用

这意味着当您执行以下操作时

var child = parentFunction();
…现在,child引用了childFunction,并且childFunction仍然可以访问创建函数时所拥有的任何变量,即使它们不再存在

为了让parentFunction调用childFunction,您需要按如下方式更改代码:

return childFunction;
致:


Douglas Crockford(JSON的先驱)有一整篇文章专门讨论,查看他关于javascript的其他文章是非常值得的。

正在演示的一点是,返回并分配给
child
的函数仍然引用在
parentFunction
内部声明的
变量,而不是在where>外部声明的变量正在调用
child()

在javascript中创建变量作用域的唯一方法是在函数体中。通常,在函数返回后,
parentFunction
中的
变量
将被丢弃

但是,由于您在
parentFunction
中声明了一个函数,该函数引用了该作用域中的
变量
,并将其传递出
parentFunction
,因此
parentFunction
中的
变量
通过在新函数中进行的引用而保留


这可以保护
变量
不受外部操作,但在
父函数
内部关闭的函数除外,谢谢。最初调用parentFunction()的是什么?为什么最初调用parentFunction()的同一个东西不调用childFunction,从而不需要返回、分配和调用内部函数?为什么在最后运行parentFunction()会放弃返回值?你能解释一下为什么parentFunction();是否有效?@mjmitche认为,在parentFunction调用和result函数调用之间,可以有很多行代码,或者想要保护封闭的变量。。。也许一个更有用的函数可以提供一些信息。试试这个链接@Eineki,谢谢。具体哪部分代码是parentFunction调用?谢谢。你用“参考”这个词是什么意思。。。“reference”是一种特殊的javascript行话/命令,还是仅仅是一个具有常规英语含义的单词?@mjmitche:意思是指引起你注意的东西,但更多一些。从某种意义上说,这就是保留这个变量或抓住它。准确地说,在javascript中,实际上不能引用变量。只有它的价值。但是我相信现在发生的是(幕后)负责
parentFunction
执行上下文的对象在新函数执行时被保留和使用,因此对内部
变量的引用仍然有效。但您可以将新函数视为持有
变量
以将其从垃圾收集中保存……几分钟后我将在这里发布几个工作示例。@mjmitche:通读这些示例中的注释。基本上,每次调用
parentFunction
,内部的
myVariable
都会返回其原始值。但是在中,我们从
parentFunction
返回一个函数,将其分配给
child
变量,然后调用
child
。您将看到
child
继续增加o
return childFunction();