作用域问题-此函数是否形成闭包-JavaScript?

作用域问题-此函数是否形成闭包-JavaScript?,javascript,parameters,scope,closures,scoping,Javascript,Parameters,Scope,Closures,Scoping,在整个脚本中,我调用函数dynamo.toolbox.add\u temp\u按钮。这方面的一个例子如下: if(page < total_pages){ dynamo.toolbox.add_temp_button("Next Page",function(){ dynamo.shop.enter.access(page+1,data.shop_zbid); }); } 请注意,这已从我的脚本中删除,但它是由dynamo.toolbox.add\u te

在整个脚本中,我调用函数
dynamo.toolbox.add\u temp\u按钮
。这方面的一个例子如下:

if(page < total_pages){
    dynamo.toolbox.add_temp_button("Next Page",function(){
        dynamo.shop.enter.access(page+1,data.shop_zbid);
    });
}
请注意,这已从我的脚本中删除,但它是由
dynamo.toolbox.add\u temp\u按钮调用的

现在,我需要知道这是否形成了一个闭包,即我传递到
add\u temp\u按钮
函数中的参数值是否会被设置为零

我最担心的是第二个参数,
callback
。这是一个作为回调函数传递给
$.bind
的函数。触发绑定事件时,它将使用
页面
回调
的当前值,还是最初传递的值

谢谢大家!

变化

if(page < total_pages){
    dynamo.toolbox.add_temp_button("Next Page",function(){
        dynamo.shop.enter.access(page+1,data.shop_zbid);
    });
}
if(页码<总页数){
dynamo.toolbox.add_temp_按钮(“下一页”,函数()){
dynamo.shop.enter.access(第+1页,数据.shopzbid);
});
}

if(页码<总页数){
发电机。工具箱。添加临时按钮(“下一页”),功能(a,b){
返回函数(){dynamo.shop.enter.access(a,b);}
})(第+1页,数据来源:Shopzbid);
}
您将得到您想要的-您需要使
page+1
data.shop_zbid
的值位于回调的本地,以获得所需的效果,否则可以在调用回调之前在回调范围之外修改它们

if(page < total_pages){
    dynamo.toolbox.add_temp_button("Next Page",function(){
        dynamo.shop.enter.access(page+1,data.shop_zbid);
    });
}
if(页码<总页数){
dynamo.toolbox.add_temp_按钮(“下一页”,函数()){
dynamo.shop.enter.access(第+1页,数据.shopzbid);
});
}

if(页码<总页数){
发电机。工具箱。添加临时按钮(“下一页”),功能(a,b){
返回函数(){dynamo.shop.enter.access(a,b);}
})(第+1页,数据来源:Shopzbid);
}

您将得到您想要的-您需要将
page+1
data.shop_zbid
的值设置为回调的本地值,以获得所需的效果,否则可以在调用回调之前在回调范围外修改它们

是,这是一个闭包,是,在运行回调时,它将使用当前值。看看这个例子:您可能会发现这对解释很有用:与所建议的不同,回调函数不是闭包。如果它是在外部函数内部创建的(即:在
If
范围内,而不是在调用
build\u temp\u按钮的内部),那么是的,它将具有闭包访问权限(
If(…){myCB=fn(a,b){…};…(page+1,myCB);}
)。现在,回调不起作用。但是您可以将其包装在匿名函数中,该函数将您想要的值传递给创建并返回的回调函数(匿名函数成为新的闭包范围)。这听起来很奇怪。。。它是。请参阅下面Martin的正确答案。是的,这是一个闭包,是的,当回调运行时,它将使用当前值。看看这个例子:您可能会发现这对解释很有用:与所建议的不同,回调函数不是闭包。如果它是在外部函数内部创建的(即:在
If
范围内,而不是在调用
build\u temp\u按钮的内部),那么是的,它将具有闭包访问权限(
If(…){myCB=fn(a,b){…};…(page+1,myCB);}
)。现在,回调不起作用。但是您可以将其包装在匿名函数中,该函数将您想要的值传递给创建并返回的回调函数(匿名函数成为新的闭包范围)。这听起来很奇怪。。。它是。请看下面Martin的正确答案。我想您的意思是使回调
(函数(a,b){return function(){dynamo.shop.enter.access(a,b);};};}(第+1页,data.shopzbid))事实上,即使浏览器由于逗号而触发匿名函数(通常情况下,如果有一个立即被调用的匿名函数没有封装在导致对其求值的内容中,这将是一个语法错误)。。。下一个问题是您不会绑定函数
dynamo。。。。访问(a、b)
。。。你会立即调用它并分配它的返回值(可能是一个错误)。@Norguard:不,你在两个帐户上都错了。这是我的理解方式,在任何当前浏览器中都不是错误。这样调用一个函数是完全有效的,但是如果您喜欢,可以这样包装:(function(){})()但是在这个场景中没有真正的区别演示如何。当您的函数求值时,它设置
dynamo…access(a,b)的值。这就是你的功能。因此,只要调用
add_temp_button()
函数,您就在运行该函数,而不是分配一个匿名函数,该函数在运行时将新范围的
a,b
应用到函数中。对。这是对“嘿”的直接调用。它没有将匿名函数绑定到按钮(或者无论
add\u temp\u button
的内部要求是什么)
sayHey=function(a){alert(a);}
button.onclick=function(words){sayHey(words);}(“Hey”)
Button.onclick是未定义的,而Button.onclick=function(words){return function(){sayHey(words);};}(“Hey”);你说得对,我没有领会你的意思,对不起,我和一个3周大的婴儿坐在这里,只用半个大脑:)我想你的意思是让回调
(函数(a,b){return function(){dynamo.shop.enter.access(a,b);};}(第+1页,data.shopzbid))事实上,即使浏览器由于逗号而触发匿名函数(通常情况下,如果有一个立即被调用的匿名函数没有封装在导致对其求值的内容中,这将是一个语法错误)。。。下一个问题是您不会绑定函数
dynamo。。。。访问(a、b)
。。。您将立即调用它并分配它的返回值(可能是错误)。@Norguard:N
if(page < total_pages){
    dynamo.toolbox.add_temp_button("Next Page",(function(a,b){
        return function() { dynamo.shop.enter.access(a,b); }
    })(page+1,data.shop_zbid));
}