Javascript 严格模式更有效吗?
一般来说,在浏览器中以“严格模式”执行javascript是否会提高性能?是否有任何主流浏览器进行了额外的优化或使用了任何其他技术来提高严格模式下的性能 稍微换一句话,严格模式的目的之一是允许浏览器引入额外的优化或其他性能增强吗?严格模式实际上不是关于性能,它是语言的一部分,其主要目的是避免被认为是容易出错的功能 基本上,它的目标是使语言更安全,引入了大量的语义更改,还进行了额外的错误检查,并且错误比较多,在非严格的代码中,事情只能默默地失败 关于性能,我认为浏览器供应商现在很难实现严格模式,问题是JS引擎大多基于ECMAScript 3,实现严格模式并不容易,因为严格的范围非常灵活,可以混合使用非严格和严格的代码 另见:Javascript 严格模式更有效吗?,javascript,Javascript,一般来说,在浏览器中以“严格模式”执行javascript是否会提高性能?是否有任何主流浏览器进行了额外的优化或使用了任何其他技术来提高严格模式下的性能 稍微换一句话,严格模式的目的之一是允许浏览器引入额外的优化或其他性能增强吗?严格模式实际上不是关于性能,它是语言的一部分,其主要目的是避免被认为是容易出错的功能 基本上,它的目标是使语言更安全,引入了大量的语义更改,还进行了额外的错误检查,并且错误比较多,在非严格的代码中,事情只能默默地失败 关于性能,我认为浏览器供应商现在很难实现严格模式,问
但我可以肯定地说,strict模式确实提供了这些机会,浏览器将实现这些机会——不管提供这些机会是否是ECMA委员会的有意目标。然而,我并不期望所有这些机会都能立即被抓住。在许多情况下,咒语可能是先正确,后性能,因为严格模式目前没有广泛使用。(我在Mozilla的JavaScript引擎上工作,并实现了strict模式的各个部分,我们以这种方式实现它,作为一条一般规则——尽管如果我尝试的话,我可能会想到一两个例外。)在大多数情况下,没有。如果仔细查看ECMAScript 5标准文档,您会发现几乎所有出现在伪代码算法中的严格模式都是:
if (isStrictMode) {
//throw an (early) SyntaxError or TypeError
}
else {
//return
}
有两件事需要注意:
<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>
Q
Q
Benchmark.prototype.setup=函数(){
职能d(i){
变量x='999';
y=eval(“y=8;”);
var z=x+y+i;
document.getElementById('a').innerHTML=z;
}
职能c(i){
“严格使用”
变量x='999';
变量y=eval(“y=8;”);
var z=x+y+i;
document.getElementById('b').innerHTML=z;
}
};
这可以在这里进行测试:
有趣的是,在“严格模式”下,参数数组的操作速度可以快6倍左右
Benchmark.prototype.setup=函数(){
var nonstrict=(函数(){
返回函数(arg1){
var指数;
for(索引=1;索引
以下是jsPerf测试:现在哪些浏览器支持ECMAScript 5?@Jamie@Jamie Wong-请参阅@Matthew:nice链接@sje397:该列表中唯一完整的ECMAScript 5实现是BESEN(从未听说过),它的主页上写道:“严格的代码比非严格的代码运行得快,因此请尽可能使用“使用严格的”IIRC Douglas Crockford声称,带有关键字的
不仅表现糟糕,而且在语言中使用它会使整个语言变慢。从CMS的回答来看,带有
关键字的在严格模式下不起作用,因此这似乎表明至少有可能提高一些速度。链接+1。不过,我不太明白第三句话与性能有什么关系。from(似乎可信):“John[Resig]没有提到的是,严格模式可能会带来更高的性能。如果浏览器被告知“我声明此代码正确无误”,它可以花更少的时间处理歧义,并着手处理手头的事务。@sje397:strict
模式的另一个好处是,如果函数声明局部变量foo
,并且不定义任何捕获它的嵌套函数,它在第一次读取之前将数字存储到foo
,并且从不将数字以外的任何内容存储到foo
,那么调用的函数(或任何其他内容)就无法使foo
保存数字以外的任何内容。很容易确定上述条件是否成立,而且处理数字的速度比wor快得多
<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>