通过Secrets of the JavaScript Ninja,我正在研究有关this关键字的构造函数。

function Ninja() {
   this.skulk = function() { return this; }
}


例:

var ninja1 = new Ninja();

window.onload = function() {
    assert(ninja1.skulk() === ninja1,
        "the 1st ninja is skulking");
};



  输出:第一个忍者在偷偷摸摸


但是,如果添加var windowNinja = Ninja(),为什么我会在Chrome中看到此JavaScript错误?

    assert(windowNinja.skulk() === window,
        "the window ninja is skulking");



  输出:JavaScript错误:未捕获的TypeError:无法调用未定义的方法“ skulk”

最佳答案

Ninja不返回任何内容,因此,如果不使用new初始化它的实例,则它将返回undefined并且存储在windowNinja中。你可以打电话

Ninja();
assert(window.skulk() === window,
    "the window ninja is skulking");


因此,this中的Ninja是全局对象(窗口),因此您要为其分配方法skulk。它返回调用它的对象。

您也可以在函数中添加返回值

function Ninja() {
   this.skulk = function() { return this; }
   return  this;
}

关于javascript - JS`this`关于函数调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20790476/

10-13 04:14