2013-02-16 38 views
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.我不确定这是如何工作的。但它的工作。如果可以解释的话,那也会很棒。我找不到其他地方使用新的Function()。

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

var input = "test"; 

,这并不工作,并没有警觉弹出。

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

+0

它的工作原理,它非常丑陋。你确定谷歌建议,而不是w3schools?提示:'Function()'~~'eval()' – 2013-02-16 07:28:39

+0

好好为你自己检查一下。那是他们做的。 – btevfik 2013-02-16 07:32:01

+0

http://code.google.com/p/channel-tac-toe/source/browse/trunk/index.html – btevfik 2013-02-16 07:33:00

回答

1

Function构造作品eval uating它的参数作为函数体。

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

类似于

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

对于数字input S,这工作,因为他们的文字表述可以作为数字文字。对于文本输入来说,它不是。有限支持可以通过执行

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

的更一般的方式来获得将是使用

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

然而,我建议使用一个立即调用函数表达式(IIFE)代替,以避免任何形式的evalJSON对象,其不以非常旧的浏览器上存在的依赖性(IE < 8):

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

或者,我F中的input变量不发生变化,则无需捕捉到它的价值:

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

或者,如果你不使用this里面的sendMessage,您可以使用bind(IE8需要匀场):

... = sendMessage.bind(undefined, input) 
+0

谢谢你的回答,这将不起作用 – btevfik 2013-02-16 07:51:28

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

这里是fiddle看你怎么可能使用。

+0

所以你应该设置'var input =''text'“;' – 2013-02-16 07:34:22

+0

非常感谢phil 。它的工作原理是 – btevfik 2013-02-16 07:36:46

+0

。但我仍然不知道新的Function()是如何工作的。该论据应该是功能主体。 'sendMessage('+ input +')'是函数体呢? – btevfik 2013-02-16 07:40:01

0

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

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

这个工程:

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 + '")'); 

就万事大吉了

+0

感谢您的答案。 – btevfik 2013-02-16 07:50:52

+0

如果'input'包含双引号 – 2013-02-16 07:52:29