![](/img/trans.png)
[英]difference between functionName() and functionName.call() in javascript
[英]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(…)
请为我澄清区别。
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();
}
该代码将全局变量a
为2
,并将返回任何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
内部值”。这意味着将enable
和disable
函数添加到了新的Child
宾语。
现在考虑调用Base()
作用。 没有新的Base
对象。 因此,不存在价值this
函数中。 新的Child
对象不会被修改,因此,当您调用.enable()
,该函数尚不存在,并且会出现所提到的错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.