2016-02-28 23 views
2

在这个例子中:是否在每次调用时重新评估名称空间函数?

function foo() { 
    function bar() { 
    return 'foo bar'; 
    } 
    bar(); 
} 
foo(); 

bar重新评估每一个Xfoo叫?

相反地:

function bar() { 
    return 'foo bar'; 
} 
function foo() { 
    bar(); 
} 
foo(); 

benchmark表明后面的例子是+/- 1.6倍更快(在Chrome)。

如果不重新评估,为什么第二种模式比第一种模式快得多?

+2

每次运行完整的函数体都会被评估。只要'bar'函数声明是body的一部分 - 每次都会对它进行评估。 – zerkms

+0

谢谢。在问我之前,我只知道我的问题的答案 - 仅仅从实际经验中得出。我想我的“线间”问题是,我将如何去验证这个问题?它是否从浏览器更改为浏览器?标准的“JavaScript如何工作?”谷歌搜索没有产生有益的结果。 – jtrumbull

+0

函数被允许在内部被缓存,所以'bar()'可能不会每次都被100%重新创建(特别是函数体可以被缓存,因为它是静态的),但是它必须重新构建信封,而第二个则不需要这样的设置成本。 – dandavis

回答

1

简答:是的。

正如您在问题的注释中所提到的,函数体中的所有内容都在您调用该函数时运行。

第二个例子更快,因为它只需要调用一个先前初始化的函数,而在第一个例子中,代码必须每次都重新初始化函数。基本上,每次调用foo()时都必须重复该工作,这会占用额外的处理时间。

相关问题