在弄乱构造函数时,我注意到以this
开头的以函数表达式编写的特权方法可以正常工作,而函数声明返回类型错误,其中function declaration is not a function
。
我知道我们可以通过内部使用this
即this.functionName
var Foo = function(){
var _color= "blue";
this.getColor = function(){
return _color;
}
function setColor(newColor){
this._color = newColor;
}
}
var bar = new Foo();
console.log(bar.setColor('red'));
关于函数声明function setColor
的幕后发生了什么,导致日志输出为Uncaught TypeError: bar.setColor is not a function
?提升/声明它的作用域是函数表达式的事实是否与此有关?
答案 0 :(得分:4)
这是一个关闭。 -Javascript具有词法作用域,构造函数范围与其实例无关。您需要通过this
访问实例。您可以通过在构造函数中分配函数引用来存储它。 this.setColor = setColor
答案 1 :(得分:2)
您无法尝试:
var Foo = function(){
var _color= "blue";
this.getColor = function(){
return _color;
}
this.setColor = function(newColor){
this._color = newColor;
return this._color;
}
}
var bar = new Foo();
console.log(bar.setColor('red'));
会发生什么情况,函数声明“ function setColor(newColor)”只是一个表达式,包含在其父函数“ function()”的范围内。这意味着,如果您未将“ setColor ”功能设置/分配给父对象( Foo )中的任何属性,则无法从外部(上)使用该功能范围。另外,您还必须返回“ this._color ”的值,否则console.log将显示“ undefined”。