我认为我们可以使用ApplicationData
代替ApplicationData
,因为在浏览器上下文中默认为alert('foo')
,因此window.alert('foo')
会自动表示this = window
相当于alert('foo')
。
因此,我不期望在严格模式下在函数中定义this.alert('foo')
函数,因为当启用严格模式时,函数中window.alert('foo')
为alert
。
这是代表我的困惑的代码。
this

这是输出。
undefined
答案 0 :(得分:7)
我认为我们可以使用
alert('foo')
代替window.alert('foo')
,因为在浏览器上下文中,默认情况下这是=窗口
不,可变分辨率(技术上标识符分辨率)与JavaScript中的this
无关。 (您可能正在考虑Java或C#,其中实例成员可以在实例方法中使用或不使用this.
访问.JavaScript' this
与Java中的this
非常不同或者C#。)我们可以使用alert
或window.alert
的原因是alert
是一个全局变量。
标识符解析的工作方式如下:如果标识符未在当前范围内定义,则JavaScript引擎会查看最近的封闭范围,然后查看下一个最近的封闭范围等。全局范围是整个容器,所以全局都可以在任何地方使用(除非被给定范围内的声明所遮蔽)。 E.g:
// (In loose mode)
var foo = "bar";
function Ctor() {
console.log("this is window? " + (this === window)); // false
console.log(foo); // "bar"
function level2() {
console.log("this is window? " + (this === window)); // true
console.log(foo); // "bar"
}
level2();
}
var c = new Ctor();
console.log("this is window? " + (this === window)); // true
console.log(foo); // "bar"
请注意this
是什么并不重要。
至于为什么alert
可以单独使用(作为全局)以及作为window
的属性:在浏览器中,window
是一个全局变量,指的是全局object(在全局范围内以松散模式也可用作this
)。在ES2015之前,所有全局变量也是全局对象的属性,因此alert
是全局变量,window.alert
是等效属性。 (与您的问题不完全相关,但为了完整性:在ES2015中,通过var
或函数声明创建的全局变量仍然是全局对象的属性,但也可以创建不是全局变量的全局变量全局对象的属性[with let
,const
和class
]。但是为Web环境定义的所有标准属性都是旧式全局变量,也是属性。)