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的想法是能够扩展和定制。 将控件放在开发人员的手中,不要试图“锁定”您的对象。