一般情况下,在浏览器中执行JavaScript时是否启用“严格模式”会使其性能更好?主流浏览器是否做了额外的优化或使用其他技术以提高在严格模式下的性能表现?
稍微改述一下,严格模式是否旨在允许浏览器引入额外的优化或其他性能增强措施,除了其它目标之外?
一般情况下,在浏览器中执行JavaScript时是否启用“严格模式”会使其性能更好?主流浏览器是否做了额外的优化或使用其他技术以提高在严格模式下的性能表现?
稍微改述一下,严格模式是否旨在允许浏览器引入额外的优化或其他性能增强措施,除了其它目标之外?
严格模式是否旨在允许浏览器引入其他优化或性能增强措施,除了其其他目标之外?
我不确定它是否是有意为之,但我认为答案是肯定的。
但我可以肯定地说,严格模式确实提供了这些机会,浏览器将实现它们,无论ECMA委员会是否有意提供这些机会。然而,我不希望所有这些机会立即被利用。在许多情况下,口号很可能是正确性先行,性能以后,因为现在严格模式并没有被广泛使用。 (我在Mozilla的JavaScript引擎上工作,并实现了严格模式的各个部分,我们通常会按照这种方式来实现--尽管如果我试图想出一个或两个例外,我可能会找到。)
严格模式并不是关于性能的问题,它是语言的一种严格变体,其主要目标是避免被认为是容易出错的特性
基本上,它的目的是使语言更加安全,引入了很多语义上的改变,还增加了额外的错误检查,而且如果有错误,会有响应的提示。在非严格代码中,事情只会悄悄地失败。
至于性能方面,我认为浏览器厂商现在正在努力实现严格模式,问题在于JS引擎大多基于ECMAScript 3,实现严格模式并不容易,因为严格性的范围非常灵活,您可以混合非严格和严格代码。
另请参阅:
strict
模式的另一个好处是,如果一个函数声明了一个本地变量 foo
,并且没有定义任何捕获它的嵌套函数,那么在第一次读取 foo
之前,它会将一个数字存储到 foo
中,并且永远不会将除数字以外的任何东西存储到 foo
中,因此被调用的函数(或其他任何东西)无法使 foo
保存除数字以外的任何东西。很容易确定上述条件是否成立,并且使用数字可以比使用偶然是数字的多态对象更容易快速地完成工作。 - supercat<div id="a">
Q
</div>
<div id="b">
Q
</div>
<script>
Benchmark.prototype.setup = function() {
function d(i) {
var x = '999';
y = eval("y = 8;");
var z = x + y + i;
document.getElementById('a').innerHTML = z;
}
function c(i) {
'use strict'
var x = '999';
var y = eval("y = 8;");
var z = x + y + i;
document.getElementById('b').innerHTML = z;
}
};
</script>
这里可以进行测试: http://jsperf.com/strict-mode
<script>
Benchmark.prototype.setup = function() {
var nonstrict = (function() {
return function (arg1) {
var index;
for (index = 1; index < arguments.length; ++index) {
arguments[0] += arguments[index];
}
return arguments[0] - arg1;
};
}());
var strict = (function() {
"use strict";
return function (arg1) {
var index;
for (index = 1; index < arguments.length; ++index) {
arguments[0] += arguments[index];
}
return arguments[0] - arg1;
};
}());
var result;
};
</script>
这是 jsPerf 测试:http://jsperf.com/strict-mode-arguments
大部分情况下不会。如果您仔细研究 ECMAScript 5 标准文档,您会发现几乎所有伪代码算法中出现的 Strict Mode 都是这样:
if (isStrictMode) {
//throw an (early) SyntaxError or TypeError
}
else {
//return
}
以下有两点需要注意:
with
关键字在严格模式下不起作用,因此这至少表明了一些加速的潜力。 - Tyler