如何将变量作为字符串注入?

8 浏览
0 Comments

如何将变量作为字符串注入?

我正在一个循环中使用动态创建的函数。\n它能够工作,但不是我想要的方式。因为当我这样做时,意味着当functiontest0运行时,它会弹出一个\"3\"的警告,因为它实际上弹出了var i,而循环已经完成了对i的添加。\n我想要的是以某种方式\"硬编码\"当前的i,这样它将实际上弹出一个\"0\",而不是\"3\"。我的意思是像这样:\n

window["functiontest" + i] = function () {
  // 我只需要这里的当前状态的`i`,而不仅仅是变量`i` - 所以例如我需要它作为文字放入0
}

\n有没有办法强制将结果写入一个\"字符串\"或其他什么东西?\n谢谢帮助,很抱歉有重复的问题,我在搜索时找不到任何东西。主要是因为我无法解释得那么好:-)\n但我最终得到了这样的结果:\n

 for (var genfunc = 0; genfunc < 4; genfunc++) {
   if (genfunc == 0) { //left
       window["keyDown" + sys_curcontrols[genfunc]] = (function (unique) {
           return function () { window["sys_keyLeft" + unique] = -1; }
       })(nid);
   }

0
0 Comments

如何将变量作为字符串插入?

问题的原因是你正在通过引用传递变量。使用匿名函数将变量隐藏起来以传递其值:

(function(i) {
    window['functiontest' + i] = function() {
        alert(i);
    };
})(i);

另外,不要像这样创建全局变量。使用一个对象:

var functiontest = {};
(function(i) {
    functiontest[i] = function() {
        alert(i);
    };
})(i);

谢谢帮助...但为什么不使用全局变量?我需要在任何地方都能够获取这些函数...这是一个性能问题吗?

不,这只是不可维护的。这里的问题不是全局变量,而是你正在创建很多本应该包含在一个对象中的全局变量。

0
0 Comments

问题的出现原因是JavaScript中的变量作用域和闭包的特性。在上述代码中,循环创建了四个函数,每个函数都有一个自由变量index。由于JavaScript中的变量作用域是函数级别的,而不是块级别的,所以在每次循环中,index的值都会被覆盖,最终导致所有函数中的index都是相同的值,即循环结束时的值。这就造成了在调用这些函数时,它们都会弹出相同的值。

为了解决这个问题,我们需要创建一个作用域,使得每个函数中的index都是独立的。可以使用立即执行函数表达式(IIFE)来实现这一点。通过将每次循环时的index作为参数传递给IIFE,并立即执行IIFE并返回一个新的函数,我们可以确保每个函数中的index都是独立的,不会被覆盖。这样,每个函数就可以正确地弹出它们各自的index值。

下面是修改后的代码:

for (var i = 0; i < 4; i++) {
    window["functiontest" + i] = (function(index) {
        return function () { alert(index); }
    })(i);
}

通过使用IIFE,我们成功地解决了变量作用域和闭包导致的问题,确保每个函数中的index都是独立的。现在,当调用这些函数时,它们会正确地弹出它们各自的index值。

0