这是一些示例代码:

ExampleClass = function()
{
    this.initiate();
};

ExampleClass.prototype.initiate = function()
{
    var connect = function()
    {
        this.sendNOP();
    };

    connect();
};

ExampleClass.prototype.sendNOP = function()
{
    console.info('Sending NOP...');
    var callback = function()
    {
        console.info('Server responded to NOP. ZzzZzzzZzz...');
    };
    setTimeout(callback, 1500);
};


我很好奇为什么不能在this.sendNOP()中调用ExampleClass.initiate,以便ExampleClass.initiate._connect()ExampleClass的instanceof作为this传递给ExampleClass.sendNOP(),似乎将window作为this传递。为什么?

编辑:

问题是,当我们调用ExampleClass.initiate._connect()时,我们仅使用connect()而不指定任何上下文。用ExampleClass.initiate._connect()调用.apply(this)有效! .apply(this)将上下文设置为ExampleClass

ExampleClass.prototype.appliedInitiate = function()
{
    var connect = function()
    {
        this.sendNOP();
    };

    connect.apply(this);
};


最终代码

ExampleClass = function()
{
    this.appliedInitiate();
};

ExampleClass.prototype.sendNOP = function()
{
    console.info('Sending NOP...');
    var callback = function()
    {
        console.info('Server responded to NOP. ZzzZzzzZzz...');
    };
    setTimeout(callback, 1500);
};

ExampleClass.prototype.initiate = function()
{
    var connect = function()
    {
        this.sendNOP();
    };

    connect(); // Won't work. connect() is not called from any context (ie. obj.connect() )
};

ExampleClass.prototype.appliedInitiate = function()
{
    var connect = function()
    {
        this.sendNOP();
    };

    connect.apply(this); // Will work, we are calling connect with apply, which sets the context to ExampleClass
};

最佳答案

您不能在this.sendNOP中呼叫ExampleClass.initiate。您正在connect中调用它。对connect的调用在initiate函数内部是无关紧要的。

您尚未使用任何上下文调用connect,因此上下文是默认对象(window)。

09-25 18:29