在使用jQuery很长一段时间之后我有一个问题,我正在使用jQuery模式(样式)编写一个简单的代码,
(function(window, undefined) {
var jQuery = function (s, c) { ... }
}) (window);
众所周知,jQuery是在一个自我执行匿名函数中定义的,我猜测它的作用域(jQuery)应该仅限于那个匿名函数,但我们如何才能访问jQuery之外的jQuery匿名方法?如果我的假设是错的......请纠正我。
我尝试编写类似于jQuery激情的代码,即用匿名方法包装我的整个代码,比如
(function( w, u ) {
var JS = function() { return JS.fn.init();};
JS.fn = JS.prototype = {
init : function () {
alert('Initiated');
return this;
}
};
}) (window);
当我尝试拨打JS().init();
时,我的firebug控制台中出现错误JS is not defined
。我哪里错了?是由于范围限制还是编写不好的代码?
答案 0 :(得分:3)
最后,将您的对象分配给window
,即使在您的匿名函数之外,它也可以全局使用。
window.JS = JS;
在jQuery的源代码中查看此行very end,其中显示了为什么jQuery
和$
在匿名函数之外定义。
window.jQuery = window.$ = jQuery;
除了范围,还有一些值得注意的事情,
JS.init()
不存在,因为没有创建新对象。使用init
构造函数创建一个新对象。
var JS = function() { return new JS.fn.init(); };
通过在调用JS()
时创建新函数,您不再需要自己调用init。要创建新对象,只需使用:
var foo = JS();
以下是完整的资料来源:
(function( w, u ) {
var JS = function() {
// create a new object
return new JS.fn.init();
};
JS.fn = JS.prototype = {
init : function () {
console.log('Initiated');
return this; // not needed
}
};
// link the init constructor with JS.prototype
JS.fn.init.prototype = JS.fn;
// make globally available
window.JS = JS;
}) (window);