在jQuery source中定义jQuery的本地副本后立即找到这些变量。
// Map over jQuery in case of overwrite
_jQuery = window.jQuery
// Map over the $ in case of overwrite
_$ = window.$
可以阅读评论并知道原因......但
这些代码行如何执行此操作?
添加类似内容会保护我的个人命名空间还是更深层次的源代码?
如果不在源代码中,可能会发生什么坏事?
答案 0 :(得分:4)
如果查看jquery.js文件,您会发现它们首先保存以前的定义(第31-32行v1.4.4行):
// Map over the $ in case of overwrite
_$ = window.$,
然后,如果您致电noConflict
,则只需将值设置回来(第397-398行)
noConflict: function( deep ) {
window.$ = _$;
您可以添加与您自己的项目类似的内容来保护名称空间。这个概念不仅仅适用于javascript。
如果没有包含这些行,那么你将无法在同一页面上运行jQuery和Prototype,因为它们都使用$
运算符 - 没有什么不好可能发生,只是你的代码不会工作并可能导致错误。
答案 1 :(得分:3)
jQuery如何保护覆盖jQuery和$
它没有(但见下文)。如果你加载jQuery,然后加载其他东西给那些符号写入别的东西,它们将不再与jQuery相关联。例如:
HTML:
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/prototype/1/prototype.js"></script>
JavaScript的:
window.onload = function() {
// Outputs false, because Prototype has overwritten it
display("Does $ === jQuery? " + ($ === jQuery));
// Outputs true, because Prototype has overwritten it
display("Does $('foo').id === 'foo'? " + ($('foo').id === 'foo'));
function display(msg) {
var p = document.createElement('p');
p.innerHTML = msg;
document.body.appendChild(p);
}
};
但是,似乎来保存它们。怎么样?
答案是closures。它在其作用域函数中有一个本地引用,它与全局引用(window
上的属性)没有关联,所以内部它不关心你是否覆盖这些符号。当然,你关心,如果你覆盖$
和 jQuery
,因为如果你这样做,你就无法调用jQuery。 :-)但是如果你只覆盖$
,这不是问题,只需使用jQuery
或者如果你不喜欢打字(让我们面对它,这很尴尬),那就这样做:
(function($) {
// Your usual jQuery code here using `$`,
// this code runs immediately
)(jQuery);
... 在匿名函数(同时定义和调用)中本地阴影 $
符号。如果您正在使用ready
事件:
jQuery(function($) {
// Your usual jQuery code here using `$`,
// this code runs when the DOM is ready (see
// the `jQuery.ready` function).
});
答案 2 :(得分:1)
如果你要包含另一个类似原型的库,它使用$
,那么jQuery需要引用$
和window.jQuery
才能支持jQuery.noConflict()
功能等...
http://api.jquery.com/jQuery.noConflict/
使用 $
是因为它很方便,但这可能会被多个库使用。
这有帮助吗?
答案 3 :(得分:1)
Javascript无法提供您正在寻找的保护。
JQuery并没有“保护”这些变量。它只是将引用$
和jquery
复制到另外两个变量中。您阅读的代码等同于:
var obj1 = {}; /* create an empty object and reference it as obj1 */
var obj2 = obj1; /* made a second reference to that same object */
此代码不会“保护”obj1
。以后您的代码更改obj1
:
obj1 = 'foo'; /* now obj1 references a string */
obj1
并没有“神奇地保留其价值”;在那一行之后,它只是一个字符串。但该对象仍可在obj2
中使用。
答案 4 :(得分:0)
这些行的目的是能够恢复原始的$
和jQuery
全局变量,以防jQuery本身覆盖它们。它没有做任何事情来保护其他代码不会覆盖jQuery。
如果要保护自己的命名空间,可以执行setInterval,检查全局变量是否仍然是对象的instanceof
(仅当对象在闭包内受保护时,否则也可以修改) )。但是,这不是一个好的做法,因为javascript的想法是能够扩展和定制。将控件交给开发人员,不要试图“锁定”对象。