Javascript这个关键字 - 内部功能

Chr*_*ley 2 javascript this

我试图理解Javascriptthis上的关键字.

我正在对chrome控制台进行一些测试,我遇到了两个不同的结果,我期望它们是相同的:

var myTest = {};
myTest.test1 = function() {
        return this; // this = Object
}
Run Code Online (Sandbox Code Playgroud)

第一个函数返回myTest我理解的对象.

var myTest = {};
myTest.test1 = function() {
    return function test2() {
        return this; // this = Window
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么第二个函数返回窗口而不是myTest对象?

谢谢

the*_*eye 5

this是指调用函数的当前对象.当你打电话时test1,你会这样做的

myTest.test1()
Run Code Online (Sandbox Code Playgroud)

现在,test1被称为myTest对象.这就是为什么在第一种情况下this提到的原因myTest.

在第二种情况下,你会这样执行

myTest.test1()()
Run Code Online (Sandbox Code Playgroud)

myTest.test1()返回一个函数,你在没有任何当前对象的情况下调用.在这种情况下,JavaScript将确保this将引用全局对象(window在本例中).

注意:但是,在严格模式下,thisundefined在第二种情况下.你可以这样确认

var myTest = {};
myTest.test1 = function() {
    return function test2() {
        console.log("this is global", this === window);
        console.log("this is undefined", this === undefined);
        return this;
    }
}

myTest.test1()();
Run Code Online (Sandbox Code Playgroud)

输出将是

this is global true
this is undefined false
Run Code Online (Sandbox Code Playgroud)

但如果你包括use strict这样的话

"use strict";

var myTest = {};
myTest.test1 = function() {
    return function test2() {
        console.log("this is global", this === window);
        console.log("this is undefined", this === undefined);
        return this;
    }
}

myTest.test1()();
Run Code Online (Sandbox Code Playgroud)

输出将是

this is global false
this is undefined true
Run Code Online (Sandbox Code Playgroud)