模块内Javascript未定义函数
给出以下Javascript示例:模块内Javascript未定义函数,javascript,Javascript,给出以下Javascript示例: var obj = function() { var _c = function() { console.log("c") } return { a: function() { b(); }, b: function() { console.log("b"); }, c: function()
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
可以访问\u c
时,有人能帮助解释为什么这是必需的吗?\u c
是一个局部变量,当执行\u c()
时,它在范围内<代码>b不可用;它只能在对象本身上找到,因此可以通过this.b
找到它
这种混乱表明将面向对象的概念从其他语言移植到JavaScript。JS中没有私有和公共成员,您不能通过保留对象前缀来调用同一对象上的方法。只有局部变量(v
当var v
或let v
时的v
),全局变量(v
当没有var v
或let v
时的v
)和对象属性(obj.prop
)。方法是包含函数的对象属性;不多也不少。您不应该直接调用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();
需要使用
this.b
,因为您正在返回一个对象,而此上下文中的“b”是该对象的属性。您需要明确说明,使用此
虽然_c是在闭包中定义的一个局部函数,但您可以在返回对象中直接访问它,而不引用返回对象。因为
b
是一个属性,而不是变量。没有函数b()
,只有{b:function(){}
完全不同,这是一个对象的属性。这并没有回答“当c可以访问_c时,有人能解释为什么这是必要的吗?”@MobyDisk抱歉,我的错,忘记添加解释了。解释得好。值得一提的是,如果存在全局函数b
(尽管没有调用OP期望的函数),则会执行对裸b()
的调用。另外,我认为您的意思是,\u c
是“当定义了c()
[非\u c()
]时,范围内的局部变量”[未执行];这实际上是一个闭包,这将是OP理解的另一个很好的JS概念。。