0

这是有史以来最令人困惑的事情。标题可能没有多大意义。我尽力了。希望我能清楚。好的,我正在查看来自谷歌频道 api 的井字游戏示例。

在javascript部分。

他们有这样的东西;

sendMessage = function(param) {
  alert(param);
  //this part actually sends message to server, 
  //for simplicity lets assume it pops up alert.    
  }

init = function(){
  var input = 3;
  var submitButton = document.getElementById('submitButton');
  submitButton.onclick = new Function('sendMessage(' + input + ')');
}

setTimeout(init, 100);

这会弹出一个警报并打印 3。我不确定它是如何工作的。但它有效。如果有人能解释这一点,那也太好了。我在其他任何地方都找不到像这样使用 new Function() 的地方。

问题是,如果输入是一个字符串,

var input = "test";

这不起作用,并且没有弹出警报。

感谢您的任何解释和帮助。

4

3 回答 3

1

Function构造函数通过将eval其参数作为函数体来工作。

... = new Function('sendMessage(' + input + ')');

类似于

... = eval("function(){sendMessage("+input+")}";

对于 numeric inputs,这是可行的,因为它们的文本表示作为数字文字工作。对于文本输入,它没有。通过做可以获得有限的支持

... = new Function('sendMessage("'+input+'")');

更通用的方法是使用

... = new Function('sendMessage("'+JSON.stringify(input)+'")');

但是,我建议使用立即调用的函数表达式 (IIFE) 来避免eval对对象的任何形式和依赖JSON,这在非常旧的浏览器中不存在 (IE<8):

... = (function(input){
  return function(){
    sendMessage(input)
  }
})(input)

或者,如果input变量没有改变,你不需要捕获它的值:

... = function(){ sendMessage(input) }

或者,如果你不在thissendMessage 内部使用,你可以使用bind(IE8 需要 shimming):

... = sendMessage.bind(undefined, input)
于 2013-02-16T07:39:37.720 回答
0

当输入为字符串时,函数调用变为:

sendMessage(string)

这实际上应该是:

sendMessage("string")或者 sendMessage('string')

sendMessage = function(param) {
  alert(param);   
  }

init = function(){
  var input = '"string"';
  var submitButton = document.getElementById('submitButton');
  submitButton.onclick = new Function('sendMessage(' + input + ')');
}

setTimeout(init, 100);

这是小提琴,看看你如何使用。

于 2013-02-16T07:28:54.507 回答
0

函数的参数被评估..也就是说它被执行了。这就是它起作用的原因。

当您传递一个字符串时,它不起作用仅仅是因为您传递的该字符串将被视为对象或变量而不是字符串。我们都知道它不存在。

IE

这有效:

submitButton.onclick = new Function('sendMessage(3)');

这不会:

submitButton.onclick = new Function('sendMessage(test)'); //because test does not exist

但这会

submitButton.onclick = new Function('sendMessage("test")');

因此,如果您将代码更改为:

submitButton.onclick = new Function('sendMessage("' + input + '")');

那么一切都很好

于 2013-02-16T07:37:56.387 回答