JavaScript-jquery 将 $ 作为参数 传入 jQuery(),导致提示 页面的某个脚本正忙的问题。

JavaScript-jquery 将 $ 作为参数 传入 jQuery(),导致提示 页面的某个脚本正忙的问题。

泛泛之交 发布于 2016-12-28 字数 146 浏览 1086 回复 3

代码例如:

<script type="text/javascript">
jQuery($);
</script>

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

泛泛之交 2017-09-16 3 楼

jQuery($);这个$是jQuery里的,还是你执行jQuery.noConflict();另外定义了呢?

如果是jQuery,那jQuery($);应该是僵死程序或者称为死循环!jQuery($)和jQuery(jQuery);一样的。

泛泛之交 2017-04-30 2 楼

我看的是最新版1.7.0的源码,为了这个回答这个题才去看JQuery的核心代码。

大致解析是这样的:
在jQuery的初始化方法里会判断jQuery()里的参数类型是什么,当传的是一个$里,由于jQuery在内部里设置了window.jQuery = window.$ = jQuery;所以$也就是jQuery,它们是同一个对象,那么当jQuery($)时实际上传的是jQuery(jQuery); OK,咱们看看它的解析流程:

在200行的地方有如下代码:

 } else if ( jQuery.isFunction( selector ) ) {
return rootjQuery.ready( selector );
}

此时的selector对象就是我们传的$,由于$的类型是一个function,那么它会执行rootjQuery.ready( selector )

接下来看看ready方法:

 ready: function( fn ) {
// Attach the listeners
jQuery.bindReady();

// Add the callback
readyList.add( fn );

return this;
},

ready()里的jQuery.bindReady()方法对应如下代码,这个方法里有一个window.attachEvent( "onload", jQuery.ready );这个是关键,就是当页面加载完成时调用jQuery.ready()方法,接着我们继续往下看

问题出在这一句:
// Add the callback
readyList.add( fn );

当我们传进来的$,就是现在这个fn,ready()方法会把我们传进来的$加入到 readyList这个回调函数列表里,这样每运行一次ready()就会把我们的$加入到一次ready()方法里,所以就造成了死循环了。

 bindReady: function() {
if ( readyList ) {
return;
}

readyList = jQuery.Callbacks( "once memory" );

// Catch cases where $(document).ready() is called after the
// browser event has already occurred.
if ( document.readyState === "complete" ) {
// Handle it asynchronously to allow scripts the opportunity to delay ready
return setTimeout( jQuery.ready, 1 );
}

// Mozilla, Opera and webkit nightlies currently support this event
if ( document.addEventListener ) {
// Use the handy event callback
document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );

// A fallback to window.onload, that will always work
window.addEventListener( "load", jQuery.ready, false );

// If IE event model is used
} else if ( document.attachEvent ) {
// ensure firing before onload,
// maybe late but safe also for iframes
document.attachEvent( "onreadystatechange", DOMContentLoaded );

// A fallback to window.onload, that will always work
window.attachEvent( "onload", jQuery.ready );

// If IE and not a frame
// continually check to see if the document is ready
var toplevel = false;

try {
toplevel = window.frameElement == null;
} catch(e) {}

if ( document.documentElement.doScroll && toplevel ) {
doScrollCheck();
}
}
},

泛泛之交 2017-01-10 1 楼

入口方法

init: function( selector, context ) {
。。。。。
else if ( jQuery.isFunction( selector ) ) {
return rootjQuery.ready( selector );**//由于$是func,调用ready方法**
}
ready方法
ready: function( fn ) {
// Attach the listeners
jQuery.bindReady();

// If the DOM is already ready
if ( jQuery.isReady ) {
// Execute the function immediately
fn.call( document, jQuery );**//又调用jQuery($)了**

// Otherwise, remember the function for later
} else if ( readyList ) {
// Add the function to the wait list
readyList.push( fn );
}

return this;
},

在ready里面造成死循环