即使`this`是'undefined`,如何在严格模式下的函数中定义`alert`?

时间:2016-02-07 17:56:26

标签: javascript html

我认为我们可以使用ApplicationData代替ApplicationData,因为在浏览器上下文中默认为alert('foo'),因此window.alert('foo')会自动表示this = window相当于alert('foo')

因此,我不期望在严格模式下在函数中定义this.alert('foo')函数,因为当启用严格模式时,函数中window.alert('foo')alert

这是代表我的困惑的代码。



this




这是输出。

undefined

1 个答案:

答案 0 :(得分:7)

  

我认为我们可以使用alert('foo')代替window.alert('foo'),因为在浏览器上下文中,默认情况下这是=窗口

不,可变分辨率(技术上标识符分辨率)与JavaScript中的this无关。 (您可能正在考虑Java或C#,其中实例成员可以在实例方法中使用或不使用this.访问.JavaScript' this与Java中的this非常不同或者C#。)我们可以使用alertwindow.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 letconstclass]。但是为Web环境定义的所有标准属性都是旧式全局变量,也是属性。)