JavaScript关闭如何工作?

你如何将JavaScript闭包解释给懂得它们构成的概念的人(例如函数,变量等),但不明白闭包本身?

我已经看到维基百科给出的Scheme示例,但不幸的是它没有帮助。


适合初学者的JavaScript闭包

由Morris在星期二提交,2006-02-21 10:19。 自社区编辑。

关闭不是魔术

本页面介绍了闭包,以便程序员能够理解它们 - 使用正在运行的JavaScript代码。 它不适用于大师或功能性程序员。

一旦核心概念得到修复,关闭并不难理解。 但是,通过阅读任何有关他们的学术论文或学术导向的信息,他们是不可能理解的!

本文面向具有某种主流语言编程经验的程序员,他们可以阅读以下JavaScript函数:

function sayHello(name) {
  var text = 'Hello ' + name;
  var say = function() { console.log(text); }
  say();
}
sayHello('Joe');

无论何时在另一个函数中看到函数关键字,内部函数都可以访问外部函数中的变量。

function foo(x) {
  var tmp = 3;

  function bar(y) {
    console.log(x + y + (++tmp)); // will log 16
  }

  bar(10);
}

foo(2);

前言:当问题是:

就像老艾伯特说的那样:“如果你不能解释给六岁的孩子,你自己真的不理解它。”好吧,我试着向一位27岁的朋友解释JS封锁,并且完全失败了。

有人可以认为我对这个主题感兴趣吗?

我很确定我是唯一一个试图从字面上理解最初问题的人之一。 从那时起,这个问题已经多次发生了变化,所以我现在的答案可能看起来非常愚蠢和不合适。 希望故事的总体思路对一些人来说仍然很有趣。


在解释困难的概念时,我是比喻和比喻的忠实粉丝,所以让我试试一个故事。

很久以前:

有一位公主......

function princess() {

她生活在一个充满冒险精彩的世界。 她遇见了她的白马王子,骑着独角兽骑着她的世界,与龙战斗,遇到说话的动物,以及其他许多梦幻般的事物。

    var adventures = [];

    function princeCharming() { /* ... */ }

    var unicorn = { /* ... */ },
        dragons = [ /* ... */ ],
        squirrel = "Hello!";

    /* ... */

但她总是不得不回到她沉闷的家务和大人的世界。

    return {

她会经常告诉他们她最新的惊人冒险作为公主。

        story: function() {
            return adventures[adventures.length - 1];
        }
    };
}

但他们只会看到一个小女孩......

var littleGirl = princess();

...讲述关于魔法和幻想的故事。

littleGirl.story();

即使成年人知道真正的公主,他们也不会相信独角兽或龙,因为他们永远看不到他们。 大人们说,他们只存在于小女孩的想象中。

但我们知道真相; 那个公主里面的小女孩......

......真的是一个里面有一个小女孩的公主。

链接地址: http://www.djcxy.com/p/13.html

上一篇: How do JavaScript closures work?

下一篇: How to modify existing, unpushed commits?