在我的命名空间JavaScript中使用this关键字

时间:2014-12-12 17:11:31

标签: javascript this

我正在创建一个经常使用的小函数库,并希望使用this关键字在我的命名空间中引用它们 - 搜索产生了许多不同的冲突建议,提示和语法。我的结构看起来像这样:

var LibraryName = {

    someValue: 0,

    firstFunc: function(stuff) {

        LibraryName.someValue = 99;
        LibraryName.secondFunction();

    },

    secondFunction: function() {

        LibraryName.doSomething(LibraryName.someValue);

    }

}

所以我想知道的是,我是否必须在我的命名空间中引用完整的函数名称,或者我可以使用关键字' this' - 我试过了:

var LibraryName = {

    someValue: 0,

    firstFunc: function(stuff) {

        this.someValue = 99;
        this.secondFunction();

    },

    secondFunction: function() {

        this.doSomething(this.someValue);

    }

}

但我得到错误说明:

Uncaught TypeError: undefined is not a function

提前致谢!

4 个答案:

答案 0 :(得分:2)

我更喜欢这种方法:

http://jsfiddle.net/71mLyk28/1/

var LibraryName = function () {
    //constructor stuff
}

LibraryName.prototype = {
    someValue: 0,
    firstFunc: function (stuff) {
        this.someValue = 99;
        this.secondFunction();
    },
    secondFunction: function () {
        this.doSomething(this.someValue);
    },
    doSomething: function(){
        console.log("success");
    }
}

var l = new LibraryName(); // instantiate a LibraryName object
l.firstFunc();

添加到原型而不是直接添加到对象有助于内存使用(如果您有多个此对象)和继承。

请参阅JS - Why use Prototype?

答案 1 :(得分:1)

doSomething方法在您的对象中不存在:

 var LibraryName = {   
      someValue: 0,    
      firstFunc: function (stuff) {
          this.someValue = 99;
          this.secondFunction();  
      },   
      secondFunction: function () {
          this.doSomething(this.someValue);
      },  
      doSomething: function (val) {
          console.log('dosomething');
      }
  };

P.S。如果你引用你的方法,使用this可能会很棘手。阅读here

JSFIDDLE

答案 2 :(得分:0)

那是因为this.doSomething没有在任何地方定义,所以如果你用this.firstFunc替换它你就不会有错误

答案 3 :(得分:0)

你可以这样试试:

 var LibraryName = {

                someValue: 0,

                firstFunc: function(stuff) {

                    this.someValue = 99;
                    this.secondFunction();

                },

                secondFunction: function() {

                    this.doSomething(this.someValue);

                },
                doSomething: function(value){
                    alert(value);
  }

            }

LibraryName.firstFunc();// since the at the creation time of `object LibraryName` ,properties and methods are added we can directly call them using `.` operator.