繁体   English   中英

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

[英]difference between functionName() and functionName.call(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(…)

请为我澄清区别。

UPDATE

function funcB(){
  return this.a;
}

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

尽管我像funcB();一样调用funcB但是此代码会提示2 funcB();

我真的不明白区别

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的Global Variable容器)。 因此,计算机下一步(执行funcA )将看到以下内容:

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

该代码将全局变量a2 ,并将返回任何funcB返回的内容,因此我们来看一下funcB 请记住,默认情况下,javascript设置this = window ,所以funcB实际上是

function funcB(){
  return window.a;
}

请记住,我们在funcA设置了window.a = 2 ,所以funcB变为

function funcB(){
  return 2;
}

这意味着funcA成为

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

这意味着alert(funcA()); 变得alert(2);

首先,考虑一下new功能。 它创建一个新对象,该对象是您指定的函数的实例。 因此, new Child基础上创建一个新对象Child

Base.call(this)意思是“就像将新创建的Child对象作为上下文一样运行Base函数”(其中“ context”的意思是“ this内部值”。这意味着将enabledisable函数添加到了新的Child宾语。

现在考虑调用Base()作用。 没有新的Base对象。 因此,不存在价值this函数中。 新的Child对象不会被修改,因此,当您调用.enable() ,该函数尚不存在,并且会出现所提到的错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM