在 MDN 中,关于Functions 和 function scope ,每次评估时都解析是什么意思?这可以通过代码观察到吗?
在函数构造函数与函数声明与函数表达式部分中引用:
由函数表达式和函数声明定义的函数只解析一次,而由 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.
我已经编写了一个代码片段来(尝试)测试并理解它:
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();
两者都警告“再次版本”。
是否重新解析是什么意思?
这可以通过代码结果来说明吗?
谢谢。
仅供参考,我尝试了另一个代码段:
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!再次更多”。