本文是筆者在看廖雪峰老師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
來定義常量,
const
與
let
都具有塊級作用域
對象的方法:
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);
}