摘要:前言中的重中之重,也是在面試中被問得最多的問題,在這里到底是什么我也時常疑惑于此,特用此文來整理思路理解并方便日后回顧。是什么看調用并轉換例子是看調用,是全局定義函數,掛載在對象上,所以是。
前言
JS中的重中之重,也是在面試中被問得最多的問題,在這里this到底是什么?我也時常疑惑于此,特用此文來整理思路理解并方便日后回顧。
函數的調用JS(ES5)里面有三種函數調用形式:
func(p1, p2) //等價于func.call(undefined, p1, p2) obj.child.method(p1, p2) //等價于obj.child.method.call(obj.child, p1, p2) func.call(context, p1, p2)
把所有的調用轉換成call的形式后,this指的就是call后面的第一個參數。
特別注意,全局定義的函數轉換成call的形式后,雖然第一個參數為undefined,但是由于全局定義的函數都是掛載到window/global對象上的,所以this會指向window/global。
看調用并轉換
例子1
function showName(){ console.log(this); //this是window } showName();//showName.call(undefined)
看調用,showName是全局定義函數,掛載在window對象上,所以this是window。
例子2
var name="hello window!"; function testName () { var name="hello this!"; console.log(this.name); } testName();//testName.call(undefined)
為什么log出來的不是"hello this!"而是"hello window!"呢?
同樣,testName也是掛載在window上的,所以testName函數在調用時this是window,
所以打出來的自然是window.name,也就是全局變量name的值"hello window!"而不是"hello this!"。
例子3
var obj={ a:"哈哈哈", b:function(){ var a="嘿嘿嘿"; console.log(this.a);//"哈哈哈" } }; obj.b();//obj.b.call(obj)
那么以上代碼為什么會打出"哈哈哈"呢?
顯然,這里的this是指obj,也就是會去找obj.a,所以打出的就是"哈哈哈"啦。
fn() this=>window/global obj.fn() this=>obj fn.call(xxx) this=>xxx fn.apply(xxx) this=>xxx fn.bind(xxx) this=>xxx new Fn() this=>新的對象 fn = () =>{} this=>外面的this
方法:
1.看源碼中對應的函數是怎么被 call 的(這是最靠譜的辦法)
2.看文檔
3.console.log(this)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/106562.html
摘要:據預測,到年,大多數的企業應用將被遷移到云中。在云計算的霧期更需要對云計算產業有一個清醒的認識,不要在最后隨著霧散去自己也隨霧而去。 從概念開始逐漸轉為應用落地,各企業紛紛加入到云計算浪潮,國家也在大力扶植云計算產業。據預測,到2020年,大多數的企業應用將被遷移到云中。與此同時,越來越多的應用開發商也將把應用開發、測試平臺遷移到云中。 專家表示,以云計算為代表的新型計算機模式未來將成...
摘要:本文是對加深對的理解一文的導圖版翻譯中的是一個捉摸不透的東西,它很喜歡變化,很詭異。寫在后面的幾種綁定規則,歸根結底,的套路就是關于幾種模式的等價變換形式,知乎上面有大神解答,猛戳這最后是全圖附上思維導圖的下載鏈接去有道云筆記下載 本文是對《加深對 JavaScript This 的理解》一文的導圖版翻譯 JS中的this是一個捉摸不透的東西,它很喜歡變化,很詭異。擁抱變化,接收詭異...
摘要:的關鍵字總是讓人捉摸不透,關鍵字代表函數運行時,自動生成的一個內部對象,只能在函數內部使用,因為函數的調用場景不同,的指向也不同。其實只要理解語言的特性就很好理解。個人對中的關鍵字的理解如上,如有不正,望指正,謝謝。 javascript的this關鍵字總是讓人捉摸不透,this關鍵字代表函數運行時,自動生成的一個內部對象,只能在函數內部使用,因為函數的調用場景不同,this的指向也不...
摘要:原文函數的純潔性純函數非純函數副作用純函數一個函數返回的值只取決于他輸入的值,并且沒有副作用,那這個函數就是純函數。因此,純函數無法對它的父作用域作出任何修改。更多關于函數純潔性的資料 原文:Glossary of Modern JavaScript Concepts: Part 1 函數的純潔性:純函數、非純函數、副作用 純函數 一個函數返回的值只取決于他輸入的值,并且沒有副作用,那...
閱讀 1186·2021-11-24 09:38
閱讀 2595·2021-09-27 14:00
閱讀 1151·2019-08-30 15:55
閱讀 1329·2019-08-30 14:16
閱讀 1482·2019-08-30 10:54
閱讀 2857·2019-08-28 17:58
閱讀 750·2019-08-26 13:22
閱讀 1222·2019-08-26 12:01