给出以下Javascript示例:
var obj = function() {
var _c = function() {
console.log("c")
}
return {
a: function() {
b();
},
b: function() {
console.log("b");
},
c: function() {
_c();
}
}
}();
调用obj.a()
会给出一个未定义b的错误。将b()
更改为this.b()
即可解决此错误。任何人都可以帮助解释为什么在c
可以访问_c
时需要这样做?
答案 0 :(得分:2)
_c
是执行_c()
时在范围内的局部变量。 b
不是;它只能在对象本身上找到,因此可以通过this.b
找到它。
这种混淆表明将面向对象的概念从其他语言移植到JavaScript。 JS中没有私有和公共成员,您不能通过保留对象前缀来调用同一对象上的方法。只有局部变量(v
或var v
时为let v
),全局变量(v
时没有var v
或let v
)和对象属性(obj.prop
)。方法是包含函数的对象属性;不多也不少。
答案 1 :(得分:0)
需要使用this.b
,因为您要返回一个对象并且' b'在此上下文中是该对象的属性。你需要明确声明使用this
虽然_c是在闭包内定义的本地函数,但您可以直接在返回对象中访问它,而不是引用返回对象。
答案 2 :(得分:-1)
你不应该直接调用b()。
var obj = function() {
var _c = function() {
console.log("c")
}
return {
b: function() {
console.log("b");
},
a: function() {
this.b();
},
c: function() {
_c();
}
}
}();
obj.a();
已添加说明:
您在函数中调用b(),其中b()在对象上定义。所以要在任何其他函数中调用函数b(),你应该参考对象来调用b
this.b();