如何将变量作为字符串注入?
如何将变量作为字符串注入?
我正在一个循环中使用动态创建的函数。\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); }
如何将变量作为字符串插入?
问题的原因是你正在通过引用传递变量。使用匿名函数将变量隐藏起来以传递其值:
(function(i) { window['functiontest' + i] = function() { alert(i); }; })(i);
另外,不要像这样创建全局变量。使用一个对象:
var functiontest = {}; (function(i) { functiontest[i] = function() { alert(i); }; })(i);
谢谢帮助...但为什么不使用全局变量?我需要在任何地方都能够获取这些函数...这是一个性能问题吗?
不,这只是不可维护的。这里的问题不是全局变量,而是你正在创建很多本应该包含在一个对象中的全局变量。
问题的出现原因是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值。