1

我在stackoverflow中阅读了很多关于闭包的示例和问题,但我觉得我无法完全理解它,这就是我得到的全部:

function testClosure (s1,s2){
    return function(s3){
        return s1 +' '+ s2 +' '+s3;
    }
}

var t1 = testClosure("test","test2");


console.log(t1("test3")); //test test2 test3
  1. t1 持有一个函数和范围链testClosure();
  2. t1 自己返回匿名函数。
  3. 当调用 t1 时,它会将内部函数置于testClosure();接受最后一个参数。
  4. s1,s2,s3 通过作用域链查找并返回。

我的理解错了吗?

4

2 回答 2

2
  1. 你执行testClosure.
  2. testClosure创建并返回一个新函数。由于该函数是在另一个函数内部创建的,因此会创建一个闭包并将其添加到新函数的作用域链中。闭包可以访问在创建时传入的参数testClosure
  3. 变量t1被赋予返回的函数作为它的值。
  4. 你调用t1并传入一个参数。在t1你的内部引用作为闭包一部分的参数。
  5. t1在当前上下文中找不到这些值,因此它查看作用域链中的下一个作用域,即闭包。
  6. t1找到值并完成执行。
于 2013-07-21T18:37:32.610 回答
0
  1. testClosure正在调用一个命名函数,该函数接受两个参数并返回一个匿名函数,并将 t1 设置为匿名函数。

t1 现在是一个匿名函数,可以调用并接受一个参数。调用 t1 时,它会从名称函数和匿名函数构建您的字符串参数参数并返回结果。

每当您调用命名函数 testClosure 时,它​​都会创建一个闭包。当您调用匿名函数时,它可以访问包含的名称函数字符串参数,并将所有 3 个参数作为构建字符串返回。


JS 中的闭包是 JavaScript 提供的最强大的实现之一。学习如何以及在哪里实施或在哪里需要关闭是通过一段时间的婴儿步骤来学习的。

你的 JavaScript 库越大,你就会发现自己越需要闭包。

闭包允许您将特定的数据片段放在其他上下文无法访问的上下文中,而且我发现自己在循环内部使用它们的次数比其他任何地方都多。

大多数时候匿名函数和闭包一起工作。学习闭包的最好方法是每天坚持不懈地学习更多关于闭包的知识,当你发现自己处于需要闭包的情况时,你最终会得到它。

下面是一个示例,我正在对远程服务器上的相册进行 AJAX 调用。AJAX 调用的成功函数保存相册的一组照片。对于每个循环,我都会调用一个名称函数,该函数将返回一个匿名函数。匿名函数设置为按钮单击事件。

添加到 DOM 的每个新按钮都可以访问它自己的封闭 url 字符串参数。

学习和理解闭包对于成为一名优秀的 JavaScript 程序员至关重要。

function testClosure(url) {

    return function (ev) {

        document.getElementById('myImg').url = url || 'http://www.dummyurl/dummy.png';
    }
}

$.ajax({
    type: "post",
    url: "http://www.myurl.com",
    data: 'photoalbum' = 45,
    dataType: "json",
    success: function (photos) {

        for (var i = 0; i < photos.length; i++) {

            var btn = document.createElement('input');
            btn.type = 'button';
            btn.onclick = testClosure(photos[i].url);

            document.body.appendChild(btn);

        };
    }
});
于 2013-07-21T18:53:21.790 回答