摘要:箭頭函數(shù)中指向等箭頭函數(shù)箭頭函數(shù)的,總是指向定義時(shí)所在的對象,而不是運(yùn)行時(shí)所在的對象。關(guān)鍵字通常不能在箭頭函數(shù)中使用除非是嵌套在允許使用的函數(shù)內(nèi)。參考資料的博客可以說很厲害了圖解指向什么阮一峰關(guān)于箭頭函數(shù)的討論
箭頭函數(shù)中this指向等
箭頭函數(shù) javascript this
“箭頭函數(shù)”的this,總是指向定義時(shí)所在的對象,而不是運(yùn)行時(shí)所在的對象。
箭頭函數(shù)位于foo函數(shù)內(nèi)部。只有foo函數(shù)運(yùn)行后(被調(diào)用后,內(nèi)部this確定),它才會按照定義生成,所以foo運(yùn)行時(shí)所在的對象,恰好是箭頭函數(shù)定義時(shí)所在的對象
function foo() { setTimeout( () => { console.log("id:", this.id); },100); } var id = 21; // 箭頭函數(shù)運(yùn)行時(shí)所在的環(huán)境 foo.call( { id: 42 } ); // 箭頭函數(shù)定義時(shí)所在的環(huán)境 // 結(jié)果是 id: 42
function foo() { return () => { return () => { return () => { console.log("id:", this.id); }; }; }; } var f = foo.call({id: 1}); var t1 = f.call({id: 2})()(); var t2 = f().call({id: 3})(); var t3 = f()().call({id: 4}); // 結(jié)果是: 1,1,1
var obj = { field: "hello", getField: () => { // 此時(shí)箭頭函數(shù)被定義,this指向obj的this,而obj的this是window,則此箭頭函數(shù)的this指向window console.log(this) }, } obj.getField(); //window
箭頭函數(shù)里不但沒有 this,也沒有 arguments, super ……
var arguments = 42; var arr = () => arguments; arr(); // 42 function foo() { var f = (i) => arguments[0]+i; // foo函數(shù)的間接參數(shù)綁定 return f(2); } foo(1); // 3
var f = (i) => arguments; f(1); // arguments is not defined
通過 call 或 apply 調(diào)用: 由于 this 已經(jīng)在詞法層面完成了綁定,通過 call() 或 apply() 方法調(diào)用一個函數(shù)時(shí),只是傳入了參數(shù)而已,對 this 并沒有什么影響
var adder = { base : 1, add : function(a) { var f = v => v + this.base; return f(a); }, addThruCall: function(a) { var f = v => v + this.base; var b = { base : 2 }; return f.call(b, a); } }; console.log(adder.add(1)); // 輸出 2 console.log(adder.addThruCall(1)); // 仍然輸出 2
箭頭函數(shù)不能用作構(gòu)造器,和 new一起用會拋出錯誤。
var Foo = () => {}; var foo = new Foo(); // TypeError: Foo is not a constructor
箭頭函數(shù)沒有prototype屬性。
var Foo = () => {}; console.log(Foo.prototype); // undefined
yield 關(guān)鍵字通常不能在箭頭函數(shù)中使用(除非是嵌套在允許使用的函數(shù)內(nèi))。因此,箭頭函數(shù)不能用作生成器。
參考資料
MDN
zhengweikeng的博客
可以說很厲害了,圖解javascript this指向什么?
阮一峰es6關(guān)于箭頭函數(shù) this 的討論
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/92579.html
摘要:對象的指向是可變的,但是在箭頭函數(shù)中,它是固定的。同樣的由于箭頭函數(shù)沒有自己的所以傳統(tǒng)的顯性綁定無效內(nèi)部的指向外部在的學(xué)習(xí)中,的指向問題一直是個難點(diǎn),特別是在對象方法中使用時(shí),必須更加小心。由此箭頭函數(shù)在很大程度上減少了我們的困擾。 什么是箭頭函數(shù) 用法 ES6 允許使用箭頭(=>)定義函數(shù) 測試 var p1 = document.getElementById(test1)...
摘要:第二種情況是箭頭函數(shù)的如果指向普通函數(shù)它的繼承于該普通函數(shù)。箭頭函數(shù)的指向全局,使用會報(bào)未聲明的錯誤。 showImg(https://segmentfault.com/img/remote/1460000018610072?w=600&h=400); 箭頭函數(shù)是ES6的API,相信很多人都知道,因?yàn)槠湔Z法上相對于普通函數(shù)更簡潔,深受大家的喜愛。就是這種我們?nèi)粘i_發(fā)中一直在使用的API...
摘要:注意因?yàn)榧^函數(shù)內(nèi)部的是指向外層代碼塊的最近的,例中的函數(shù)的,所以我們可以通過改變外層代碼塊的的指向從而改變箭頭函數(shù)中的指向例中使用了函數(shù)的方法。 一、this關(guān)鍵字小測試 ES6箭頭函數(shù)體中的this指向哪里? 在回答這個問題之前先來揣揣你對this關(guān)鍵字的了解程度:(讓我們回到ES6之前)題: var obj = { a: function() { cons...
摘要:調(diào)用在中,通過的形式調(diào)用一個構(gòu)造函數(shù),會創(chuàng)建這個構(gòu)造函數(shù)實(shí)例,而這個實(shí)例的指向創(chuàng)建的這個實(shí)例。如下例所示,在構(gòu)造函數(shù)內(nèi)部使用并沒有改變?nèi)肿兞康闹怠o@然,箭頭函數(shù)是不能用來做構(gòu)造函數(shù)。 關(guān)于javascript中this指向的問題,現(xiàn)總結(jié)如下,如有不正確,歡迎指正。 javascript中,this的指向并不是在函數(shù)定義的時(shí)候確定的,而是在其被調(diào)用的時(shí)候確定的。也就是說,函數(shù)的...
摘要:而改變了這種狀態(tài),雖然定義的類用運(yùn)算符得到的仍然是,但它不能像普通函數(shù)一樣直接調(diào)用同時(shí),中定義的方法函數(shù),也不能當(dāng)作構(gòu)造函數(shù)用來調(diào)用。而在中,用調(diào)用一個構(gòu)造函數(shù),會創(chuàng)建一個新對象,而其中的就指向這個新對象。 JavaScript 中的 this 指向問題有很多博客在解釋,仍然有很多人問。上周我們的開發(fā)團(tuán)隊(duì)連續(xù)兩個人遇到相關(guān)問題,所以我不得不將關(guān)于前端構(gòu)建技術(shù)的交流會延長了半個時(shí)候討論 ...
閱讀 2495·2021-11-24 10:29
閱讀 2634·2021-09-24 09:48
閱讀 5737·2021-09-22 15:56
閱讀 3152·2021-09-06 15:00
閱讀 2667·2019-08-30 15:54
閱讀 741·2019-08-30 13:48
閱讀 2894·2019-08-30 11:17
閱讀 3417·2019-08-29 11:20