我对封闭的理解是错误的吗?

时间:2013-07-21 18:11:13

标签: javascript closures

我在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. 的函数和范围链
  3. t1自行返回匿名函数。
  4. 当调用t1时,它将内部函数放在testClosure();上以接受最后一个参数。
  5. s1,s2,s3是通过范围链查找并返回。
  6. 我的理解错了吗?

2 个答案:

答案 0 :(得分:2)

  1. 执行testClosure
  2. testClosure创建并返回一个新函数。由于函数是在另一个函数内部创建的,因此会创建一个闭包并将其添加到新函数的作用域链中。闭包可以访问在创建时传递给testClosure的参数。
  3. 变量t1被赋予返回的函数作为其值。
  4. 你打电话给t1并传递一个参数。在t1内部,您引用了作为闭包的一部分的参数。
  5. t1无法在当前上下文中找到这些值,因此它会查看作用域链中的下一个作用域,即闭包。
  6. t1找到值并完成执行。

答案 1 :(得分:0)

  1. testClosure 正在调用一个接受两个参数并返回匿名函数的命名函数,并将t1设置为匿名函数。
  2. t1现在是一个匿名函数,可以调用并接受一个参数。当调用t1时,它会从name函数和匿名函数构建字符串param参数并返回结果。

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


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

    JavaScript库越大,你发现自己需要关闭的次数越多。

    Closures允许您将特定的数据放在其他上下文不可及的上下文中,并且我发现自己在循环中使用它们比其他任何地方都要多。

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

    以下是我在远程服务器上对相册进行AJAX调用的示例。 AJAX调用的成功功能包含专辑的一系列照片。对于每个循环,我正在调用一个名称函数,该函数将返回一个匿名函数。匿名函数设置为按钮单击事件。

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

    学习和理解闭包是一个很好的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);
    
            };
        }
    });