Javascript functionName()和functionName.call之间的差异(此)
我研究javascript中的函数继承。 根据我读到的文章,我编写了代码: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
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正确,没有新的基对象。但在第一个示例中,有一个新的子对象,它继承自基对象。