箭頭函式中的this

2022-01-19 16:57:07 字數 2518 閱讀 4855

箭頭函式有幾個使用注意點。

(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,就是函式foothis,所以t1t2t3都輸出同樣的結果。因為所有的內層函式都是箭頭函式,都沒有自己的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 ...