1.閉包
1.閉包就是函數(shù)的返回值也是個函數(shù)
當(dāng)一個函數(shù)的返回值也是一個函數(shù)時穗椅,其內(nèi)部的局部變量還被新函數(shù)引用,內(nèi)部變量的使用就會造成錯誤奶栖。
注意:返回函數(shù)不要引用任何循環(huán)變量匹表,或者后續(xù)會發(fā)生變化的變量(例如for循環(huán)的變量)
eg:
function count() {
var arr = [ ];
for (var i=1; i<=3; i++) {
arr.push(function () {
return i * i;
});
}
return arr;
}
var results = count();
f();//此時內(nèi)層函數(shù)for的i已經(jīng)變?yōu)?,在被外層函數(shù)使用宣鄙,得到的值最終是16
2.解決方法:再創(chuàng)建一個函數(shù)袍镀,用該函數(shù)的參數(shù)綁定循環(huán)變量當(dāng)前的值,無論該循環(huán)變量后續(xù)如何更改冻晤,已綁定到函數(shù)參數(shù)的值不變苇羡。
eg:
function count() {
var arr = [];
for (var i=1; i<=3; i++) {
arr.push((function (n) {
return function () {
return n * n;
}
})(i));//把該函數(shù)的參數(shù)綁定 i 當(dāng)前的值
}
return arr;
}
創(chuàng)建一個匿名函數(shù)并立刻執(zhí)行,形如:
(function (x) { return x*x } (3))
2.箭頭函數(shù)
1.箭頭函數(shù)相當(dāng)于匿名函數(shù)奥喻,并且簡化了函數(shù)定義于微。
形式: x => xx;
等價于:
function( x) {
return xx;
}
箭頭函數(shù)有兩種格式:
第1種是只包含一個表達式,連{ ... }和return都省略掉了似袁。
eg:
x => x*x;
第2種可以包含多條語句攘轩,這時候就不能省略{ ... }和return:
eg:
x => {
if(x >0)
return x*x ;
else
return x*(-x);
}
兩個參數(shù),括號括起來: (x, y) => x * x + y * y叉存;
如果返回對象,因為函數(shù)體
{.....}
會與對象沖突度帮,所以改變?yōu)?....):
x = ( { foo:x } );
箭頭函數(shù)的this的指向和作用域是根據(jù)上下文決定的歼捏。也更加方便的解決了之前出現(xiàn)的this指向?qū)ο髥栴}。
箭頭函數(shù)完全修復(fù)了this的指向,this總是指向詞法作用域瞳秽,也就是外層調(diào)用者xiaoming瓣履。
var xiaoming = {
name:'小明 ',
birth: 1990,
getAge: function () {
var b = this.birth; // 1990
var fn = () => new Date().getFullYear() - this.birth; // this指向xiaoming
return fn();
}
};
xiaoming.getAge(); // 28
由于this在箭頭函數(shù)中已經(jīng)按照詞法作用域綁定了,所以寂诱,用call()或者apply()調(diào)用箭頭函數(shù)時拂苹,無法對this進行綁定,即傳入的第一個參數(shù)被忽略痰洒。