functionName()和functionName.call(this)之间的区别

时间:2016-11-26 17:36:38

标签: javascript inheritance this

我在javascript中研究功能继承。 根据我读过的文章,我写了代码:

function Base(){
    var enableVar = true

  this.enable = function(){
      console.log("enable");
        enableVar = true;
  }
   this.disable = function(){
      console.log("disable");
        enableVar = true;
  }
}

function Child(){
    Base.call(this);
}

new Child().enable();

此代码正常运行,我在控制台中看到了消息。

但我不明白行:

Base.call(this);

对我而言,Base函数调用this替换为this,因此与Base();相同

但看起来我的状态是错的。我看到错误:

VM898:62Uncaught TypeError: (intermediate value).enable is not a function(…)

请为我澄清差异。

更新

function funcB(){
  return this.a;
}

function funcA(){
  this.a = 2;   
  return funcB();
}
alert(funcA());

此代码提醒2虽然我调用了像funcB

这样的funcB();

我真的不明白差异

2 个答案:

答案 0 :(得分:2)

functionName.call(obj)通常会调用functionName,但主要区别在于:functionName内,this指的是obj。通常this引用window,但使this引用obj非常适合继承,因为您可以继续在所有构造函数中使用this

编辑(解释更新):

这是你的代码:

function funcB(){
  return this.a;
}

function funcA(){
  this.a = 2;   
  return funcB();
}
alert(funcA());

我们将逐步完成此操作。实际运行的第一件事是alert(funcA());,它会调用funcA()。该代码默认情况下this等于window(窗口是javascript&#39的全局变量容器)。那么计算机看到的下一步(执行funcA)是:

function funcA(){
  window.a = 2;   
  return funcB();
}

该代码将全局变量a设置为2,并返回funcB返回的内容,因此我们将查看funcB。请记住,默认情况下,javascript设置this = window,因此funcB实际上是

function funcB(){
  return window.a;
}

请注意,我们将window.a = 2设置回funcA,因此funcB成为

function funcB(){
  return 2;
}

这意味着funcA变为

function funcA(){
  window.a = 2;   
  return 2;
}

这表示alert(funcA());变为alert(2);

答案 1 :(得分:1)

首先,考虑一下new的作用。它创建一个新对象,它是您指定的函数的实例。因此,new Child会根据Child

创建一个新对象

Base.call(this)表示“运行Base函数,就好像新创建的Child对象作为上下文”(其中“context”表示“this的内部值”)。这意味着enabledisable函数会添加到新的Child对象中。

现在想想调用Base()的是什么。没有新的Base对象。因此,函数中没有this的值。新的Child对象未被修改,因此当您调用.enable()时,该函数尚不存在,并且您收到了您提到的错误。