2012-03-06 77 views
29

免責聲明:爲什麼,如果我使用jQuery不要在家


試試這個,不$($)凍結頁面?

+3

美元是一個函數。如果你自己調用它,它會運行到無限遞歸。 – Demnogonis 2012-03-06 14:46:27

+8

+1免責聲明! – charlietfl 2012-03-06 14:53:02

+3

爲什麼這個問題需要保護? – 2012-11-02 00:41:40

回答

38

$($)$(document).ready($)的快捷方式。所以,它會運行這個函數(當DOM準備就緒時,或者直接在這種情況下)。

傳遞給.ready的函數爲了方便而傳遞了jQuery函數(當您處於noConflict模式時特別有用)。因此,$($)將以$作爲參數調用$ - 並且所有事情都會再次發生,這是無止境的遞歸。


另一種解釋:

  1. 你叫$($)
  2. jQuery將函數參數($)添加到內部ready列表中。
  3. 一段時間後,jQuery發現DOM已經準備就緒,並認爲:「讓我們調用ready列表中的所有函數」。
  4. ready列表中的唯一功能是$,因此它調用$
  5. jQuery sees它應該將$函數作爲參數傳遞給這些函數。
  6. 它將$作爲參數$
  7. $函數看到一個函數作爲它的參數,但是因爲DOM已經準備就緒,它直接調用函數(沒有什麼可以等待的)。
  8. 使用$作爲參數調用$函數。
  9. 自第7步起,所有事情都會再次發生。
+5

'$($)是$(document).ready'的快捷方式真的嗎? – 2012-03-06 14:47:26

+9

@LightnessRacesinOrbit - Yes - '$(func)'是'$(document).ready(func)'的快捷方式。 – pimvdb 2012-03-06 14:48:02

+1

你會認爲所有的安全檢查正在做,這將是我們微不足道的添加... – 2012-03-06 14:48:09

23

現在這就是我所說的「jQueryception」。

你在jQuery中調用整個jQuery庫。

更多信息;

當您調用「$」(由jQuery庫定義爲jQuery核心函數)時,它將初始化jQuery並嘗試調用已定義的函數(如果它有)。當你實際調用「$($);」你會在jQuery中調用jQuery,它會一次又一次地調用jQuery。

從jQuery 1.7.1源代碼;

// HANDLE: $(function) 
    // Shortcut for document ready 
    } else if (jQuery.isFunction(selector)) { 
     return rootjQuery.ready(selector); 
    } 

而且

rootjQuery = jQuery(document); 

正如你所看到的,當你調用$($);它試圖用你的函數的名字來調用jQuery,如果你再次用jQuery調用它,同樣的事情將會像我之前解釋過的那樣無休止地發生。

+4

+1:喜歡:-) – 2012-03-06 14:46:49

+12

+1:「我們必須去$ eeper」 – Zeta 2012-03-06 15:03:34

+0

@Diabolic - 你能解釋一點點,所以這個答案不會被刪除嗎? – Neal 2012-03-08 15:00:35

3

$是工廠函數jQuery的別名。

jQuery工廠函數在傳遞函數作爲第一參數時,在document.ready處運行該函數並將jQuery作爲第一個參數傳遞給它。

因此,當達到document.ready時,最終會出現無限遞歸。

+0

在文檔加載完成後,如何在控制檯上運行它時如何工作(使用相同的結果)? – 2012-03-06 15:49:23

+0

@GGG如果'document.ready'已經到達,'jQuery'繼續執行並在調用時運行給它的函數。 – JAAulde 2012-03-06 15:57:25

+0

啊,當然... – 2012-03-06 15:57:54