Javascript未定义函数内部模块

时间:2016-03-22 02:10:36

标签: javascript

给出以下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时需要这样做?

3 个答案:

答案 0 :(得分:2)

_c是执行_c()时在范围内的局部变量。 b不是;它只能在对象本身上找到,因此可以通过this.b找到它。

这种混淆表明将面向对象的概念从其他语言移植到JavaScript。 JS中没有私有和公共成员,您不能通过保留对象前缀来调用同一对象上的方法。只有局部变量(vvar v时为let v),全局变量(v时没有var vlet 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();