模块内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()

给出以下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
可以访问
\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概念。。