2013-07-28 31 views
2

在我的JavaScript代碼中,我有一個自動執行的匿名函數,它立即執行。在裏面,我有document.ready()這確保在做東西之前dom已經準備好了。只是想知道我的代碼中的document.ready是否是多餘的。自動執行javascript中的匿名函數

(function() { 
"use strict"; 
var app = { 
    init: function() { 
     app.addLun('Hello'); 
     $('#some_id').on('click', this.changeStuff); 
    }, 
    changeStuff: function(e) { 
     e.preventDefault(); 
     $('#some_id').text("Cool text"); 
    }, 
    addLun: function(a) { 
     console.log(a); 
    } 
}; 
$(document).ready(function() { 
    app.init(); 
}); 
})(); 
+3

這取決於該代碼的位置。但是我認爲自從'init'方法訪問DOM以來就很重要,所以它需要做好準備。最糟糕的情況是DOM已經準備好了(以某種方式)並且'app.init();'立即執行。沒有錯。特別是因爲我認爲,因爲該方法被稱爲'init',它只會被調用一次...所以它不像'$(document).ready('部分將被執行多次 – Ian

+0

這並不是真的適用於你atm,但只是一個小心的詞:調用'$(document).ready(function(){...});'多次(例如在一個循環中)將導致內部函數被多次調用..我已經看到它發生了幾次,所以我想我只是把它扔在那裏哈哈 – asifrc

回答

4

自執行的匿名函數和jQuery的ready事件處理無關彼此所以,不,它不是多餘的。

2

一般來說,沒有。立即調用的函數表達式將被立即調用,而$(document).ready可以延遲執行。如果你知道在DOM準備好之後將會執行整個代碼塊,那麼確定它是多餘的,但情況可能並非如此。

你可以,但是,與整個街區傳遞給$(document).ready更換您立即調用的函數表達式,如:

$(document).ready(function() { 
    "use strict"; 
    var app = { 
     // ... 
    }; 
    app.init(); 
}); 
+0

+1。請將所有內容都放在準備好的處理程序中,注意儘管對於所示示例來說這絕對沒問題,但顯然可能不適用於其他情況。 – nnnnnn

0

如果你不寫$(文件)。就緒一部分,那麼你將在init函數內部訪問$('#some_id')而不等待$(document).ready事件,這不會自然發揮作用。隨着的document.ready,它會工作雖然並具有相同的效果如下面的代碼:

$(document).ready(function() 
{ 
    "use strict"; 

    var app = { 
     init: function() { 
      app.addLun('Hello'); 
      $('#some_id').on('click', this.changeStuff); 
     }, 
     changeStuff: function(e) { 
      e.preventDefault(); 
      $('#some_id').text("Cool text"); 
     }, 
     addLun: function(a) { 
      console.log(a); 
     } 
    }; 

    app.init(); 
}); 
+0

_「您正在訪問$('#some_id')而不等待$(document).ready事件」_ - 否,在OP的代碼中,訪問位於從ready處理程序中調用的方法內。 – nnnnnn

+0

你說得對,我在那裏以一種錯誤的方式表達自己。 –

+1

很酷,更新更好。請注意,如果整個腳本出現在主體的末尾(或任何地方),那麼您就不需要一個準備好的處理程序。 – nnnnnn

0

答案是No.Its 不是多餘的。

原因:

  1. 自調用函數即刻運行即會盡快,因爲它是在遇到的Javascript執行。
  2. $(document).ready(function() {})();只有在dom元素完全構建後纔會觸發。

所以基本上,存在封閉內(function(){ ... })();。至於$(document).ready(function() {})();前半部分將等待所有的DOM元素,以準備和後期將立即開始執行沒有意義的。

注:現在

,如果我們使用純JavaScript,我們要執行後DOM準備的東西,然後結束body標籤</body>之前剛剛加載腳本。

REFER THIS LINK

+0

在OP的示例中,ready函數需要包含在IIFE中,否則它將無法訪問'app'變量。 – nnnnnn

+0

我的觀點是,如果他在dom.ready中寫入了enire的東西,或者如果沒有dom,那麼整個代碼仍然會很不錯,只需在底部標籤中包含腳本,在end body標籤之前 –