Javascript functionName()和functionName.call之间的差异(此)

Javascript functionName()和functionName.call之间的差异(此),javascript,inheritance,this,Javascript,Inheritance,This,我研究javascript中的函数继承。 根据我读到的文章,我编写了代码: function Base(){ var enableVar = true this.enable = function(){ console.log("enable"); enableVar = true; } this.disable = function(){ console.log("disable"); enableVar = tr

我研究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(…)
请给我澄清一下区别

更新 虽然我调用了
funcB
类似
funcB(),但此代码向2发出警报


我真的不明白两者的区别。首先,想想新的代码有什么作用。它将创建一个新对象,该对象是指定函数的实例。因此,
newchild
基于
Child

Base.call(this)
表示“运行
Base
函数,就像新创建的
子对象作为上下文一样”(其中“context”表示“this
的内部值”)。这表示将
启用
禁用
函数添加到新的
子对象中

现在想想调用
Base()
会做什么。没有新的
Base
对象。因此,函数中没有
this
的值。新的
子对象
不会被修改,因此当您调用
时,启用()
,该函数还不存在,您会得到您提到的错误。

functionName.call(obj)
通常调用
functionName
,但有一个主要区别:在
functionName
的内部,
指的是
obj
。通常
指的是
窗口
,但是将
引用
obj
对于继承非常好,因为您可以继续使用
贯穿所有构造函数

编辑(解释更新): 这是您的代码:

function funcB(){
  return this.a;
}

function funcA(){
  this.a = 2;   
  return funcB();
}
alert(funcA());
我们将一步一步地运行这个过程。实际运行的第一件事是
alert(funcA());
,它调用
funcA()
。该代码默认情况下将
this
视为等同于
window
(window是javascript的全局变量容器)。因此,计算机将下一步看到什么(执行
funcA
)这是:

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

function funcB(){
  return window.a;
}
请记住,我们在
funcA
中设置了
window.a=2
,因此
funcB
变为

function funcB(){
  return 2;
}
function funcA(){
  window.a = 2;   
  return 2;
}
这意味着
funcA
成为

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

这意味着
警报(funcA());
变为
警报(2);

请参见
在草率模式下变为全局对象。在严格模式下它是
未定义的
@gstackoverflowanswer@onesomedayNow想想什么叫基地()没有。没有新的基本对象。因此,函数中没有此值。请澄清this@gstackoverflow正确,没有新的基对象。但在第一个示例中,有一个新的子对象,它继承自基对象。