2012-05-31 61 views
0

JavaScript有一个Function构造函数产生一个匿名函数:为什么我不能将函数传递给Function构造函数?

new Function() 

当传递一个函数作为参数传递给Function,我得到一个语法错误:

new Function(function(){}) 

产生

SyntaxError: Unexpected token (

但是,当我传递一个数字时,一切正常:

new Function(10) 

为什么在将函数传递给Function时出现语法错误?

+4

因为那么世界就会爆炸:)。 – Corbin

+0

你可以尝试这样做:http://stackoverflow.com/questions/2274695/new-function-with-lower-case-f-in-javascript – linguini

回答

2

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function

考虑所有,但最后一个参数是参数名,我不希望任何其他不是字符串的工作。

我想象的语法错误是因为你在内部使用的JS引擎的方式尝试将函数转换为字符串。我真的很惊讶,它不扼杀在10.

另外,我怀疑你只是出于好奇,这样做,但如果你不是,我建议你不要在你可以控制的代码中使用Function 。除非在运行时需要使用一个字符串并使其不起作用,否则没有必要使用Function。

+0

_“我真的很惊讶它不呛在10上。“_我想用一个函数JS将'10'转换为一个字符串,然后尝试使用它作为新函数的主体,除了包含一个数字的字符串实际上是一个有效的函数体。 “10”本身就是一种无所作为的表达,但它实际上并不是语法错误。 '10 \ n 11 \ n alert(12)'将起作用(即使没有分号,只要有指示的实际换行符;'10; 11; alert(12);'全部工作在一行)。 – nnnnnn

+0

@nnnnnn当然会,但功能是不同的背景。 10作为变量名是无效的,所以我希望它以某种方式抛出异常或错误。我不希望出现语法错误,尽管我认为在传递函数的情况下完全可以理解,因为传递函数可能会在解析时被捕获。 (真的,用一个新的函数(10)'',我也会理解一个语法错误。'var a = 10; new Function(a);'我不会期待其中一个。 ,我只是认为解析器可能会抓住它。 – Corbin

+0

对不起,我在回复它的同时编辑我的注释。“new Function()”的参数需要是一个字符串 - 或者显然是某种东西它可以被转换成一个字符串 - 它本身作为一个函数_body_是有效的。当一个函数被转换成一个字符串时,它包含了单词“function”和参数等:''function(){}“',所以这不是一个有效的函数体''10“'是一个有效的函数体 – nnnnnn

2

因为函数构造函数需要字符串参数并评估最后一个函数体,期望它是有效的javascript。当它尝试将匿名函数参数评估为String时,它会失败,因为该匿名函数的String表示形式不是有效的javascript。

0

我不知道的方式,错误,但你可以尝试这样的事:用

var func = function(){}; 
new Function(func) 
+0

这会有同样的问题。 – nnnnnn

0

我建议:中

new Function(func) 

代替

new Function(func(){}) 

哪里你必须将func定义为一个单独的函数。 以下示例演示:

<html> 
<script> 
function init(func) 
{ 
    func(); 
} 
function greet() 
{ 
    alert("good morning!"); 
} 
</script> 
<body onLoad="init(greet);"> 
<body> 
</html> 
相关问题