箭頭函式有幾個使用注意點。
(1)函式體內的this
物件,就是定義時所在的物件,而不是使用時所在的物件。
(2)不可以當作建構函式,也就是說,不可以使用new
命令,否則會丟擲乙個錯誤。
(3)不可以使用arguments
物件,該物件在函式體內不存在。如果要用,可以用 rest 引數代替。
(4)不可以使用yield
命令,因此箭頭函式不能用作 generator 函式。
上面四點中,第一點尤其值得注意。this
物件的指向是可變的,但是在箭頭函式中,它是固定的。
function foo() , 100);
}var id = 21;
foo.call();// id: 42
上面**中,settimeout
的引數是乙個箭頭函式,這個箭頭函式的定義生效是在foo
函式生成時,而它的真正執行要等到 100 毫秒後。如果是普通函式,執行時this
應該指向全域性物件window
,這時應該輸出21
。但是,箭頭函式導致this
總是指向函式定義生效時所在的物件(本例是
),所以輸出的是42
。
箭頭函式可以讓settimeout
裡面的this
,繫結定義時所在的作用域,而不是指向執行時所在的作用域。下面是另乙個例子。
function timer() , 1000);
}var timer = new timer();
settimeout(() => console.log('s1: ', timer.s1), 3100);
settimeout(() => console.log('s2: ', timer.s2), 3100);// s1: 3
// s2: 0
上面**中,timer
函式內部設定了兩個定時器,分別使用了箭頭函式和普通函式。前者的this
繫結定義時所在的作用域(即timer
函式),後者的this
指向執行時所在的作用域(即全域性物件)。所以,3100 毫秒之後,timer.s1
被更新了 3 次,而timer.s2
一次都沒更新。
箭頭函式可以讓this
指向固定化,這種特性很有利於封裝**函式。下面是乙個例子,dom 事件的**函式封裝在乙個物件裡面。
var handler = ,
dosomething: function(type)
};
上面**的init
方法中,使用了箭頭函式,這導致這個箭頭函式裡面的this
,總是指向handler
物件。否則,**函式執行時,this.dosomething
這一行會報錯,因為此時this
指向document
物件。
this
指向的固定化,並不是因為箭頭函式內部有繫結this
的機制,實際原因是箭頭函式根本沒有自己的this
,導致內部的this
就是外層**塊的this
。正是因為它沒有this
,所以也就不能用作建構函式。
所以,箭頭函式轉成 es5 的**如下。
// es6
function foo() , 100);
}// es5
function foo() , 100);
}
上面**中,轉換後的 es5 版本清楚地說明了,箭頭函式裡面根本沒有自己的this
,而是引用外層的this
。
請問下面的**之中有幾個this
?
function foo() ;
};};
}var f = foo.call();
var t1 = f.call()()();// id: 1
var t2 = f().call()();// id: 1
var t3 = f()().call();// id: 1
上面**之中,只有乙個this
,就是函式foo
的this
,所以t1
、t2
、t3
都輸出同樣的結果。因為所有的內層函式都是箭頭函式,都沒有自己的this
,它們的this
其實都是最外層foo
函式的this
。 箭頭函式及箭頭函式中this的使用
1.定義函式的方式 function const aaa function 3.es6中的箭頭函式 const ccc 引數列表 3.1 有乙個引數 括號可省略 const sum num1 3.2 有兩個引數 const sum num1,num2 3.3 函式 塊中有多行 時 依次寫 const...
箭頭函式中的this
首先說this的問題對於大多數新手來說都是個問題,現在由於es6的普及,箭頭函式也是深受大家的喜愛,箭頭函式中的this又是如何的?由於個人寫作水平有限,直接上乾貨 箭頭函式中的this是區域性的,怎麼理解呢?一般我們都知道,this是呼叫時確定的,確定於執行時的環境。個人理解箭頭函式中的this是...
ES6 函式 箭頭函式 箭頭函式中的this
1,es6中,函式新增哪些特性 支援引數有預設值,支援剩餘引數,支援引數展開運算,新建箭頭函式 ie不支援箭頭函式 2,支援引數預設值 在為傳引數值或傳遞的引數值是undefined的情況下,引數取預設值。引數b有預設值 hello function test a,b hello 未傳引數給引數b ...