javascript - 在 Javascript 中按值传递变量

标签 javascript loops reference

我已经看到很多类似的问题,但感觉我仍然遗漏了一些东西。我有以下代码:

_setHotKeys: function(values, buttons){
    var hotKeyMap = {
            target: document, 
            binding:[]
        }; 

        values.forEach(function(value, index){
            if(value.hotkey){
                this.button = buttons[index]; 
                hotKeyMap.binding.push({
                    key: value.hotkey,
                    fn: function(key, event){
                        this._handleFillInValueButtonToggle(this.button, true); 
                    },
                    scope: this 

                }); 
            }

        }, this)    


        var keyMap = new Ext.util.KeyMap(hotKeyMap); 
},

在这个函数中,我尝试使用 Ext.js 设置热键。此代码将为 value 中的每个值设置一个热键。数组,但它们都设置为 this.buttonbuttons 中的最后一个按钮大批。我的结论是它正在推送对 this.button 的引用。而不是将值放入数组中,因此随着循环的进行,这个值会发生变化。如何将其设置为推送值而不是引用?

最佳答案

您得出的结论是正确的。

对于循环的每次迭代,您已将 this.button 指定为等于循环索引处的按钮。如果我们把它拆开,它看起来像;

this.button = buttons[0]
this.button = buttons[1]
this.button = buttons[2]

以此类推,直到循环结束。一旦它到达循环的末尾,this.button 就等于数组中的最后一个按钮。因此,当热键事件执行时,它自然会使用对 this.button 的引用,它指向数组中的最后一个按钮。

您应该将按钮[索引] 引用直接传递给您的处理程序,而不是将引用分配给类属性。

...
fn: function(key, event) {
   this._handleFillInValueButtonToggle(button[index], true);
}

关于javascript - 在 Javascript 中按值传递变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38532584/

相关文章:

javascript - 隐藏时注释掉元素

c# - 是否有合并两个集合的有效方法?

list - 是否可以在同一个剧本(Ansible)中循环进入两个不同的列表?

c++ - 有没有正确的方法在 C++ 中通过引用返回一个新的对象实例?

c - 将 &var 传递给 *var 和将 var 传递给 var 有什么区别?

c++ - 标准如何允许通过空指针进行间接寻址?

javascript - tensorflow : Uncaught (in promise) TypeError: Cannot read property 'length' of undefined

javascript - 通过更改构造函数属性动态替换原型(prototype)

javascript - md-dialog 中的 Angular-Material md-select

javascript - 将 for in 替换为带有对象的常规 for 循环