5

我有以下代码

var PROMO = PROMO || {};

PROMO.Base = (function () {
  var _self = this;

  var Init = function () {
    WireEvents();
  };

  var WireEvents = function () {
   //wire up events
  };

} ());

在同一个文件中,我有调用上述函数的代码

我正在尝试达到可以使用以下代码的终点

 $(document).ready(function () {
    PROMO.Base.Init();
 });

这给出了错误

Cannot call method 'Init' of undefined

现在我知道编写 javascript 的方法有很多,但在这种情况下,我希望能够调用我的函数,或者至少以上面显示的方式调用 Init 方法。

4

3 回答 3

6
var PROMO = PROMO || {};

PROMO.Base = (function () {
  var _self = this;

  var Init = function () {
    WireEvents();
  };

  var WireEvents = function () {
   //wire up events
  };

  var reveal = {
        Init: Init        
  };

  return reveal;

} ());

您需要返回面向公众的功能。请参阅更新的代码。

于 2013-05-07T19:37:11.473 回答
5

使用IIFE和直接归因来处理这两种模式。

Usingvar使定义私有,并且您的函数不返回任何内容。用这个:

PROMO.Base = {
    Init: function() {
    },
    WireEvents: function() {
    };
};

您正在使用 IIFE(立即执行的函数表达式)包装定义。因此,您的PROMO.Base对象将被分配(function(){//blabla})();返回的值。但是你的函数没有return声明。默认情况下它将返回undefined.

这是你的PROMO.Base意愿undefined,你会得到这个:

Cannot call method 'Init' of undefined

如果你真的想要那个 IIFE:

var PROMO = PROMO || {};
// NEVER use _self = this inside static functions, it's very dangerous.
// Can also be very misleading, since the this object doesn't point to the same reference.
// It can be easily changed with Function.prototype.call and Function.prototype.apply
PROMO.Base = (function () {

    _PROMO = {
        Init : function () {
            document.body.innerHTML += "itworks";
        },
        WireEvents : function () {
   //wire up events
        }
    }
    return _PROMO;
} ());
PROMO.Base.Init();

更新

更好更简单的模式是将函数简单地分配给PROMO.Base. 请注意,您不应该大写静态函数,而只能大写构造函数。因此,如果某些东西不打算实例化,请不要调用它Init,它应该是init. 那就是约定。

var PROMO = {};
PROMO.Base = {};
PROMO.Base.init = function() {
    console.log("this works");
};
PROMO.Base.wireEvents = function() {
    console.log("this is a static function too");
};
于 2013-05-07T19:34:48.563 回答
0

您可以将其附加到window对象上,例如...

window.PROMO = (function($, _){

// this will access PROMO.Base 
PROMO.Base = {
    // inner functions here
    Init:{}
};

})(jQuery, _);

然后像你一样加载它。

或者如果你依赖于 jQuery

(function($){
    var PROMO = {
        // inner functions
        Init: function(){},
        WireEvents: function(){}
    };

    $.PROMO = PROMO;
})(jQuery);

准备好 DOM

jQuery(function ($) {
    var promo = $.PROMO || undefined;
    promo.Base.Init();
});
于 2013-05-07T19:48:11.500 回答