a1=10;
d1=new Date();
for( var i=0;i<=100000;i++){
a1;
}
console.log(new Date()-d1,a1===window.a1);
d2=new Date();
for( var i=0;i<=100000;i++){
this.a1;
}
console.log(new Date()-d2,this.a1===window.a1);
d3=new Date();
for( var i=0;i<=100000;i++){
window.a1;
}
console.log(new Date()-d3,this.a1===window.a1);
//输出
116,真
53,真
98,真
在全球范围内,a1 === this.a === window.a,为什么速度如此不同?
(铬合金39.0.2171.71米)
答案 0 :(得分:0)
如果您在strict mode
中使用"use strict";
,则a
需要使用关键字var
或函数参数function(a){}
进行定义。 window.a
将始终是全局对象window
中的属性,this
将是“当前执行”范围,将由您在构造对象内确定,即( new FN()
)或将函数绑定到特定对象时
var obj = {a:'hi'};
function greet(){console.log(this.a)};
obj.greet.bind(obj)(); //prints 'hi'
在严格模式下无法遵守这些规则将导致编译器错误。
现在如果你没有在严格模式下没有定义变量a
=== window.a
,因为系统将查找本地声明,如果没有找到它将假设是因为意味着是全局对象的一部分(在浏览器中的窗口)。并且在非显式声明的执行范围内this
也将引用全局对象,在某些情况下,在不在严格模式下的平面脚本上= = window.a === this.a.是因为这些“混乱”的行为,建议使用“严格模式”。我希望这有帮助