JavaScript函數定義和調用 變量作用域


 本文是筆者在看廖雪峰老師JavaScript教程時的個人總結
 
JavaScript中函數定義可以是這樣的格式
function 函數名(參數) {
    函數體
}
也可以是這樣的格式     
var 函數名 = function (參數) {
    函數體
};
 
關鍵字一:arguments
              獲取全部參數
           只在函數內部起作用,並且永遠指向當前函數的調用者傳入的所有參數。 arguments類似 Array但它不是一個 Array。第一個參數是arguments[0]....[n]
關鍵字二:rest
                    獲取 獲取除了已定義參數之外的參數
                    定義函數的時候要這樣寫
                               function foo(a, b, ...rest)
                    如果參數正常,則rest是一個空數組
 
 
 
 
         變量作用域
                     如果一個變量在函數體內部申明,則該變量的作用域為整個函數體,在函數體外不可引用該變量
                     如果兩個不同的函數各自申明了同一個變量,那么該變量只在各自的函數體內起作用
                     由於JavaScript的函數可以嵌套,此時,內部函數可以訪問外部函數定義的變量,反過來則不行
                     JavaScript的函數在查找變量時從自身函數定義開始,從“內”向“外”查找。如果內部函數定義了與外部函數重名的變量,則內部函數的變量將“屏蔽”外部函數的變量
        變量提升
                JavaScript的函數定義有個特點,它會先掃描整個函數體的語句,把所有申明的變量“提升”到函數頂部
                JavaScript引擎自動提升了變量的聲明,但不會提升變量的賦值。
          
          全局作用域
                不在任何函數內定義的變量就具有全局作用域。實際上,JavaScript默認有一個全局對象 window,全局作用域的變量實際上被綁定到 window的一個屬性        
                JavaScript實際上只有一個全局作用域。任何變量(函數也視為變量),如果沒有在當前函數作用域中找到,就會繼續往上查找,最后如果在全局作用域中也沒有找到,則報ReferenceError錯誤
     
 
          塊級作用域     
                為了解決塊級作用域,ES6引入了新的關鍵字 let,用 let替代 var可以申明一個塊級作用域的變量(for循環中)
               
          常量
                     ES6標准引入了新的關鍵字 const來定義常量, constlet都具有塊級作用域
 
 
 
          對象的方法:
                    1.在一個對象方法內部, this是一個特殊變量,它始終指向當前對象。要保證this指向正確,必須使用obj.方法
                    2.把對象的方法放到外面定義,在內部通過一屬性指向函數名。如果在外部直接調用這個函數,則this指向全局對象window。在static模式下,函數的this指向undefined,所以在static模式下,會得到一個錯誤
                     3.this指針只在對象的函數中指向對象,如果在對象的函數內的函數還是指向undefined。如果要在函數的函數中使用this,可以先聲明一個that變量捕獲this,在函數的函數中使用this的地方換成that
 
                    4.怎么控制函數中this指針的指向,可以使用函數自帶的apply方法。它接收兩個參數,第一個參數就是需要綁定的 this變量,第二個參數是 Array,表示函數本身的參數。普通函數的話this指針值是null
                    執行格式:函數名.apply(指向的對象(或者null),[函數本身需要的參數列表以數組形式傳進來])
                    函數也自帶一個call方法,call和apply的區別在於                           
        • apply()把參數打包成 Array再傳入;
        • call()把參數按順序傳入。
                    5.通過apply實現裝飾器。
                         步驟1.需要替換掉的函數也就是需要重構或者說是需要增加功能的函數fun()
                                        var oldfun = fun;
                                        fun = function(){
                                             增加的功能代碼
                                              return oldfun.apply(null,arguments);
                                          }
                    
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
          


免責聲明!

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



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