OOP Javascript'这'嵌套私有方法中的关键字

OOP Javascript 'this' keyword in a nested private method

本文关键字:关键字 有方法 Javascript OOP 嵌套      更新时间:2023-09-26

下面是一些示例代码:

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);
};

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

编辑:

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

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
};

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

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