Javascript 我对闭包的理解是错误的吗?

Javascript 我对闭包的理解是错误的吗?,javascript,closures,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 t1拥有testCl

我在stackoverflow中读了很多关于闭包的例子和问题,但我觉得我不能完全理解它,以下是我所得到的:

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

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


console.log(t1("test3")); //test test2 test3
  • t1拥有
    testClosure()的函数和作用域链
  • t1本身返回匿名函数
  • 调用t1时,它将内部函数置于
    testClosure()之上
    接受最后一个参数
  • s1、s2、s3通过作用域链进行查找并返回
  • 我的理解错了吗

  • 执行
    testClosure
  • testClosure
    创建并返回一个新函数。由于该函数是在另一个函数中创建的,因此会创建一个闭包并将其添加到新函数的范围链中。闭包可以访问在创建时传递到
    testClosure
    的参数
  • 变量
    t1
    被分配返回函数作为其值
  • 调用
    t1
    并传入一个参数。在
    t1
    中,您引用了作为闭包一部分的参数
  • t1
    无法在其当前上下文中找到这些值,因此它将查看范围链中的下一个范围,即闭包
  • t1
    查找值并完成执行
  • testClosure调用一个命名函数,该函数接受两个参数并返回一个匿名函数,并将t1设置为匿名函数
  • t1现在是一个匿名函数,可以调用并接受一个参数。调用t1时,它从name函数和anonymous函数生成字符串参数,并返回结果

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


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

    JavaScript库越大,就越需要闭包

    闭包允许您将特定的数据放在其他上下文无法触及的上下文中,我发现自己在循环中使用闭包的次数比在其他任何地方都多

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

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

    添加到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);
    
            };
        }
    });
    
    函数testClosure(url){
    返回功能(ev){
    document.getElementById('myImg')。url=url | |'http://www.dummyurl/dummy.png';
    }
    }
    $.ajax({
    类型:“post”,
    url:“http://www.myurl.com",
    数据:“相册”=45,
    数据类型:“json”,
    成功:功能(照片){
    对于(var i=0;i
    #2听起来不对-t1不返回函数,t1是一个anon函数,调用时返回字符串。@Ed Heal抱歉,但你是什么意思?@enix-你的测试证明你的逻辑正确与否了吗?一个问题是“JavaScript闭包是如何工作的”。他的意思是你是否尝试将其插入计算机并运行它,然后改变代码/玩它,直到a)你明白发生了什么,或者b)你看到某些东西以不同于你预期的方式工作。你的问题中有一个关键部分似乎遗漏了,“我希望它能这样做,但它确实做到了。为什么?”正如你目前的问题一样,它相当于“向我解释闭包。”-在这种情况下,老师给你的正确答案是:读一本书,然后玩它们直到你理解它们。
    t1
    是closure@newacct我想你是对的。返回的函数实际上是一个函数加上闭包可用的变量。执行
    t1
    时,其范围链类似于:
    [激活对象关闭(s1、s2)、激活对象全局(窗口等)]
    。由于分配给
    t1
    的函数将闭包的激活上下文作为其作用域链的一部分,因此可以将
    t1
    称为闭包。
    t1
    是闭包,因为它是引用函数外部变量的函数(
    s1
    s2
    )。另一方面,您可以说
    testClosure
    不是一个闭包,因为它没有引用它之外的任何变量。当执行
    t1
    时,有它的内部作用域,它的父级是创建
    t1
    testClosure
    函数的执行作用域,然后在上面是
    testClosure
    定义之外的作用域。