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

Scoping issue - Is this function forming a closure - JavaScript?

本文关键字:闭包 -JavaScript 是否 函数 问题 作用域      更新时间:2023-09-26

在整个脚本中,我都在调用函数dynamo.toolbox.add_temp_button。这里有一个例子:

if(page < total_pages){
    dynamo.toolbox.add_temp_button("Next Page",function(){
        dynamo.shop.enter.access(page+1,data.shop_zbid);
    });
}

正如您在这个调用中看到的,传递了两个参数,page+1data.shop_zbid。现在,这些值不是常量,并且由于脚本的整体功能而变化很快。

现在是函数本身:

add_temp_button : function(text,callback){
    var id = text.toLowerCase().replace(/[^A-Za-z_]/g,"_");
    callback = callback !== undefined && callback !== null ? callback : function(){};
    var but = '<button value="'+text+'" id="jqi_state0_button'+id+'" name="jqi_state0_button'+id+'" class="dynamo_temp_button">'+text+'</button>';
    $("#jqi_state0_buttonClose").before(but);
    $("#jqi_state0_button"+id).bind('click',callback);
},

请注意,这已经从我的脚本中删除,但它是由dynamo.toolbox.add_temp_button调用的。

现在,我需要知道这是否形成了一个闭包,即我传递给add_temp_button函数的参数的值会被设置为石头吗?

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

谢谢!

更改

if(page < total_pages){
    dynamo.toolbox.add_temp_button("Next Page",function(){
        dynamo.shop.enter.access(page+1,data.shop_zbid);
    });
}

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));
}

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