(function(){})() 立即執行函數 $(function (){}) DOM加載后


Js方法:

復制代碼
<script type=”text/javascript”>

window.onload=function (){

    var userName=”xiaoming”;

    alert(userName);

}
</script>
復制代碼

jQuery方法,需要引用jQuery文件:

復制代碼
<script type=”text/javascript”>

$(document).ready(function (){

    var userName=”xiaoming”;

    alert(userName);

});
</script>
復制代碼

或者其簡寫:

復制代碼
$(function (){

var userName=”xiaoming”;

alert(userName);

});
復制代碼

在DOM加載完就可以執行(比window.onload更早)。在同一頁面中可以多次出現.ready()

兩者主要區別:Window.onload=function (){}:

當一個文檔完全下載到瀏覽器中時,才會觸發window.onload事件。這意味着頁面上的全部元素對js而言都是可以操作的,也就是說頁面上的所有元素加載完畢才會執行。這種情況對編寫功能性代碼非常有利,因為無需考慮加載的次序。

 

$(document).ready(function (){});

會在DOM完全就緒並可以使用時調用。雖然這也意味着所有元素對腳本而言是可以訪問的,但是,並不意味着所有關聯的文件都已經下載完畢。換句話說,當HTML下載完成並解析為DOM樹之后,代碼就會執行。

 

使用$(document).ready(function (){})一般來說都要優於使用onload事件處理程序,但必須要明確一點,因為支持文件可能還沒有加載完成,所以類似圖像的高度和寬度這樣的屬性此時不一定有效。

 

注:用把js放在頁面底部的方法以及運用defer=”defer”的方法都是會出現問題的。最好使用$(document).ready(function (){})函數。

 

 

 

理解javascript中的立即執行函數(function(){})()

 

之前看了好多代碼,都有用到這種函數的寫法,但是都沒認真的去想為什么會這樣寫,今天開始想學習下jquery的源碼,發現jquery也是使用這種方式,用(function(window, undefined){})(window)包裹內部代碼,於是進一步的去學習了下。

要理解立即執行函數(function(){})(),先了解些函數的基本概念(函數聲明、函數表達式、匿名函數)。

函數聲明:使用function聲明函數,並指定函數名。 

function setFn() {
    // coding   
}

函數表達式:使用function聲明函數,但未指定函數名,將匿名函數賦予一個變量。

var setFn = function() {
    // coding
}

匿名函數:使用function關鍵字聲明函數,但未指定函數名。匿名函數屬於函數表達式,匿名函數有很多作用,賦予一個變量則創建函數,賦予一個事件則成為事件處理程序或創建閉包等等。

function() {
    // coding
}

函數聲明與函數表達式的不同在於:

1. 函數聲明可在當前作用域下提前調用執行,函數表達式需等執行到該函數后,方可執行,不可提前調用。

復制代碼
setFn()
function setFn() {
    // coding  
}
// 正常,函數聲明可提前調用

setFn()
var setFn = function() {
    // coding
} 
// 報錯,setFn未保存對函數的引用,函數調用需放在函數表達式后面
復制代碼

2. 函數表達式可直接在函數后加括號調用。

var setFn = function() {
    console.log(2)
}()

// 2   解析至此,可直接執行調用

立即執行函數(function(){})()可以看出很像函數表達式的調用,但為什么要加括號呢?如果不加括號:

復制代碼
function(){
    console.log(1)
}()

// 報錯,函數需要函數名

解析: 雖然匿名函數屬於函數表達式,但未進行賦值,所以javascript解析時將開頭的function當做函數聲明,故報錯提示需要函數名
復制代碼

立即執行函數里面的函數必須是函數表達式,所以由var setFn = function() {}()可以理解為在匿名函數前加了 = 運算符后,將函數聲明轉化為函數表達式,所以拿!,+,-,()...等運算符來測試下是否如此。

復制代碼
!function(){
    console.log(1)
}()
// 1
    
+function(){
    console.log(2)
}()
// 2
    
-function(){
    console.log(3)
}()
// 3
    
(function(){
    console.log(4)
})()
// 4
復制代碼

 

由此可見,加運算符確實可將函數聲明轉化為函數表達式,而之所以使用括號,是因為括號相對其他運算符會更安全,可以減少不必要的麻煩。

立即執行函數與正常函數傳參形式是一致的。

(function(a, b){
    console.log(a + b);
})(1, 2)
// 3

(function(){}())這樣寫的好處是在內部定義的變量不會跟外部的變量有沖突,達到保護內部變量的作用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM