【发布时间】:2013-12-20 02:57:26
【问题描述】:
在MDN中,关于Functions and function scope,每次求值都解析是什么意思?这可以通过代码观察到吗?
在函数构造函数 vs. 函数声明 vs. 函数表达式部分引用:
由函数表达式和函数声明定义的函数只解析一次,而由 Function 构造函数定义的则不。也就是说,传递给 Function 构造函数的函数体字符串必须在每次评估时都进行解析。虽然函数表达式每次都会创建一个闭包,但函数体不会重新解析,所以函数表达式仍然比“new Function(...)”快。因此,应尽可能避免使用 Function 构造函数。
然而,应该注意的是,嵌套在通过解析 Function 构造函数的字符串生成的函数中的函数表达式和函数声明不会重复解析。例如:
var foo = (new Function("var bar = \'FOO!\';\nreturn(function() {\n\talert(bar);\n});"))();
foo(); //The segment "function() {\n\talert(bar);\n}" of the function body string is not re-parsed.
我写了一段代码 sn-p 来(尝试)测试并理解它:
var bar = 'FOO!';
var foo = (new Function("return(function() {\n\talert(bar);\n});"))();
bar = 'FOO! again';
foo(); //The segment "function() {\n\talert(bar);\n}" of the function body string is not re-parsed.
var bar2 = 'FOO!2';
var foo2 = function() { alert(bar2); };
bar2 = 'FOO!2 again';
foo2();
两个都提醒“再次版本”。
reparsed是什么意思?
这可以通过代码结果来说明吗?
谢谢。
仅供参考,我尝试了另一个代码 sn-p:
var bar = 'FOO!';
var string1 = "return(function() {\n\talert(bar);\n});";
var foo = (new Function(string1))();
bar = 'FOO! again';
foo(); //The segment "function() {\n\talert(bar);\n}" of the function body string is not re-parsed.
string1 = "return(function() {\n\talert(bar + ' more');\n});";
foo();
两个警报“FOO!再次”,不是“FOO!再次更多”。
【问题讨论】:
-
计算变量
bar与解析表达式不同。 -
我认为所做的区分只会影响性能,不会影响代码的效果。
-
谢谢@Barmar,我也认为这主要是一个性能问题。但是,据我了解,重新解析就像重新阅读(或重新编译)代码一样。因此,如果在每次解析之间更改了那段代码,在某些情况下它应该能够反映在结果中。
-
当然。但它是一个不同的函数构造函数。
-
他们的意思是,即使传递给
Function构造函数的参数是与之前相同的字符串,它们也会被重新解析。
标签: javascript performance function parsing function-constructor