jQuery如何保护覆盖jQuery和$
这些变量位于jQuery源中定义jQuery的本地副本之后。
// Map over jQuery in case of overwrite _jQuery = window.jQuery // Map over the $ in case of overwrite _$ = window.$
人们可以阅读评论并知道原因……但是
-
这些代码行如何做到这一点?
-
添加类似的东西会保护我的个人命名空间还是更深层次的源代码?
-
如果不在源代码中,可能会发生什么坏事?
jQuery如何保护覆盖jQuery和$
它没有(但见下文)。 如果你加载jQuery,然后加载其他东西给那些符号写入别的东西,它们将不再与jQuery相关联。 例:
HTML:
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); } };
实时复制
但是 ,它似乎确实保留了它们。 怎么样?
答案是关闭 。 它在其作用域函数中有一个本地引用,它与全局引用( window
上的属性)没有关联,因此在内部它不关心是否覆盖这些符号。 当然, 你关心,如果你覆盖$
和 jQuery
,因为如果你没有办法调用jQuery。 :-)但是如果你只覆盖$
,这不是问题,只需使用jQuery
或者如果你不喜欢打字(让我们面对它,它很尴尬),这样做:
(function($) { // Your usual jQuery code here using `$`, // this code runs immediately )(jQuery);
…在匿名函数(在同一时间定义和调用)中本地隐藏 $
符号。 如果你正在使用它的ready
事件,jQuery使这个变得特别容易:
jQuery(function($) { // Your usual jQuery code here using `$`, // this code runs when the DOM is ready (see // the `jQuery.ready` function). });
如果查看jquery.js文件,您会发现它们首先保存以前的定义(第31-32行v1.4.4行):
// Map over the $ in case of overwrite _$ = window.$,
然后,如果你调用noConflict
它只是设置值(第noConflict
行)
noConflict: function( deep ) { window.$ = _$;
您可以添加类似于您自己的项目的东西来保护名称空间。 这个概念不仅仅适用于javascript。
如果没有包含这些行,那么你将无法在同一页面上运行jQuery和Prototype,因为它们都使用$
运算符 – 没有什么不好可能发生,只是你的代码不起作用并可能导致错误。
如果你要包含另一个像prototype这样使用$
库,那么jQuery需要引用$
和window.jQuery
来支持jQuery.noConflict()
函数等…
http://api.jquery.com/jQuery.noConflict/
$
是因为它很方便,但是它的价格可能会被多个库使用。
这有帮助吗?
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
。
这些行的目的是能够恢复原始的$
和jQuery
全局变量,以防jQuery本身覆盖它们。 它没有做任何事情来保护其他代码不会覆盖jQuery。
如果要保护自己的命名空间,可以执行setInterval,检查全局变量是否仍然是对象的instanceof
(仅当对象在闭包内受保护时,否则也可以对其进行修改)。 但是,这不是一个好的做法,因为javascript的想法是能够扩展和定制。 将控件放在开发人员的手中,不要试图“锁定”您的对象。