在我的模块模式中,由于某种原因,选项是“未定义的”..有没有人知道为什么它们没有被正确传递?
Framework.MyModule = (function(options) {
var defaults = {
someOption : 1,
stuff : 2
};
if (!options) {
var options = defaults;
} else {
for (var index in defaults) {
if (typeof options[index] == 'undefined')
options[index] = defaults[index];
}
}
var module = {};
// Initialize
_something();
// Private Methods
function _something() {}
// Public Methods
module.click = function() {};
return module;
})();
... docready function ...
var options = {
someOption : 9,
stuff : 10
};
Framework.MyModule(options);
... end doc ready ...
答案 0 :(得分:3)
var options = { /* ... */};
Framework.MyModule = (function(options) {
/* .. options are undefined ... */
})();
Framework.MyModule = (function(options) {
/* .. options are defined... */
})(options);
现在,如果您希望能够添加私有/公共变量并仍然传递选项,则需要使用它来使用公共对象返回构造函数方法 - 因此不会在立即运行的函数中传递选项。因为老实说..这不是真的有意义。
你可以这样做:
var Module = {};
Module.Foo = (function($){ // jQuery is accessible as $
var _private = {
defaults: {
url: '/default-url', container: '#dummy'
},
foos: []
};
return function(o){ // returns constructor
// other _private variables are accessible here
var opts = $.extend({}, _private.defaults, o);
var self = { // public return object
load: function(){
$(opts.container).load(opts.url);
}
};
_private.foos.push(self);
return self;
};
})(jQuery); // scope global variables
var foo1 = Module.Foo({
url: '/test.php',
container: '#success'
});
var foo2 = Module.Foo({
url: '/test2.php',
container: '#success2'
});
foo1.load();
foo2.load();
答案 1 :(得分:2)
您没有将任何选项传递给匿名函数调用。
如果您希望使用自定义选项,则必须以})(options);
结束通话。
答案 2 :(得分:1)
您正在立即执行该功能。该函数返回模块,它是一个对象,而不是一个函数。你的意思是返回一个函数吗?
然后使用:
调用它Framework.MyModule(options);