下面小編就為大家帶來一篇基於javaScript的this指向總結。小編覺得蠻不錯的,現在就分享給大家,也給大家做個參考。一起跟著小編過來看看吧
在javascript中this的指向一直是前端同事的心頭病,也同時是各面試題的首選,現在我們就來總結一下js中this的指向。首先要先了解幾個概念:
1:全域變數預設掛載在window物件下
2 :一般情況下this指向它的呼叫者
3:es6的箭頭函數中,this指向創建者,並非呼叫者
4:透過call、apply、bind可以改改變this的指向
下面我們具體分析一下
1:在函數呼叫時
(非嚴格模式)
const func = function () { console.log(this); const func2 = function () { console.log(this); }; func2(); //Window }; func(); //Window
(嚴格模式)
'use strict' const func = function () { console.log(this); const func2 = function () { console.log(this); }; func2(); //undefined }; func(); //undefined
結合第四和第一兩條規則:func這個函數是全域的,預設掛載在window物件下,this指向它的呼叫者即window,所以輸出window對象,但是在嚴格模式下,this不允許指向全域變數window,所以輸出為undefined(func2在函數直接呼叫時預設指向了全域window,其實這屬於javascript設計上的缺陷,正確的設計方式是內部函數的this 應該綁定到其外層函數對應的物件上,為了規避這一設計缺陷,聰明的JavaScript 程式設計師想出了變數替代的方法,約定俗成,該變數一般被命名為that。
2:作為物件方法
const user = { userName: '小张', age: 18, selfIntroduction: function () { const str = '我的名字是:' + this.userName + ",年龄是:" + this.age; console.log(str); const loop = function () { console.log('我的名字是:' + this.userName + ",年龄是:" + this.age); }; loop(); //我的名字是:undefined,年龄是:undefined } }; user.selfIntroduction(); //我的名字是:小张,年龄是:18
依照咱的第一條規則,this指向他的呼叫者,selfIntroduction()方法的呼叫者是user,所以在selfIntroduction()方法內部this指向了他的父對象即user,而loop方法輸出的為undefined的原因就是我在上面所說的javascript的設計缺陷了,在這種情況下,我們通常會選擇在selfIntroduction()方法裡將this快取下來。
const user = { userName: '小张', age: 18, selfIntroduction: function () { const str = '我的名字是:' + this.userName + ",年龄是:" + this.age; console.log(str); const that=this; const loop = function () { console.log('我的名字是:' + that.userName + ",年龄是:" + that.age); }; loop(); //我的名字是:小张,年龄是:18 } }; user.selfIntroduction(); //我的名字是:小张,年龄是:18
此時loop的this指向就理想了。
const user={ userName:'小张', age:18, selfIntroduction:function(){ const str='我的名字是:'+this.userName+",年龄是:"+this.age; console.log(str); } }; const other =user.selfIntroduction; other(); //我的名字是:undefined,年龄是:undefined const data={ userName:'小李', age:19, }; data.selfIntroduction=user.selfIntroduction; data.selfIntroduction(); //我的名字是:小李,年龄是:19
在看這段程式碼,將selfIntroduction()賦值給了全域變數other,呼叫other()方法,other掛載在全域函數window物件下,window物件下沒有userName 和age 這兩個屬性,所以輸出為undefined。第二段程式碼,申明了data對象,包含了username和age屬性,記住我們的第二條規則一般情況下this指向它的調用者,大家就明白了,data是selfIntroduction()的函數的調用者,所以輸出了data的userName和age。
3:在html裡作為事件觸發
<body> <p id="btn">点击我</p> </body>
const btn=document.getElementById('btn'); btn.addEventListener('click',function () { console.log(this); //<p id="btn">点击我</p> })
在種情況其實也是遵循了第二條規則一般情況下this指向它的呼叫者,this指向了事件的事件來源即event。
4:new關鍵字(建構子)
const fun=function(userName){ this.userName=userName; } const user=new fun('郭德纲'); console.log(user.userName); //郭德纲
這個就不多贅述了, new關鍵字建構了一個物件實例,賦值給了user,所以userName就成為了user物件的屬性。
5:es6(箭頭函數)
const func1=()=>{ console.log(this); }; func1(); //Window
const data={ userName:'校长', selfIntroduction:function(){ console.log(this); //Object {userName: "校长", selfIntroduction: function} const func2=()=>{ console.log(this); //Object {userName: "校长", selfIntroduction: function} } func2(); } } data.selfIntroduction();
大家在看看我開頭說的第三條準則:es6的箭頭函數中,this指向創建者,並非調用者,fun1 在全局函數下創建,所以this指向全局window,而fun2在對象data下創建, this指向data對象,所以在func2函數內部this指向data對象,個人認為es6的箭頭函數的this指向是對我上面所說的javascript設計缺陷的改進,(個人認知)。
6:改變this的指向
call、apply、bind這三個函數是可以人為的改變函數的this指向的,這裡就不多說這三者的差別了,在往後的部落格裡我會詳細解釋這三者的差別的。現在先拿一個來舉一個例子
const func=function(){ console.log(this); }; func(); //window func.apply({userName:"郭德纲"}); //Object {userName: "郭德纲"}
這三個方法都是可以人為的改變this的指向,區別是call、apply會將該方法綁定this之後立即執行,而bind方法會傳回一個可執行的函數。
說這很多總結起來就是我開頭說的4點
1:全域變數預設掛載在window物件下
2:一般情況下this指向它的呼叫者
3:es6的箭頭函數中,this指向創建者,並非呼叫者
4:透過call、apply、 bind可以改改變this的指向
說實話第一次寫博客,確實挺忐忑的,會不會有人看我的博客?會不會寫的不正確? ……想好多了,總結了:不好的地方歡迎指正。
以上是關於javaScript中的this指向總結詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。

JavaScript框架的強大之處在於簡化開發、提升用戶體驗和應用性能。選擇框架時應考慮:1.項目規模和復雜度,2.團隊經驗,3.生態系統和社區支持。

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr

Node.js擅長於高效I/O,這在很大程度上要歸功於流。 流媒體匯總處理數據,避免內存過載 - 大型文件,網絡任務和實時應用程序的理想。將流與打字稿的類型安全結合起來創建POWE

Python和JavaScript在性能和效率方面的差異主要體現在:1)Python作為解釋型語言,運行速度較慢,但開發效率高,適合快速原型開發;2)JavaScript在瀏覽器中受限於單線程,但在Node.js中可利用多線程和異步I/O提升性能,兩者在實際項目中各有優勢。

JavaScript起源於1995年,由布蘭登·艾克創造,實現語言為C語言。 1.C語言為JavaScript提供了高性能和系統級編程能力。 2.JavaScript的內存管理和性能優化依賴於C語言。 3.C語言的跨平台特性幫助JavaScript在不同操作系統上高效運行。

JavaScript在瀏覽器和Node.js環境中運行,依賴JavaScript引擎解析和執行代碼。 1)解析階段生成抽象語法樹(AST);2)編譯階段將AST轉換為字節碼或機器碼;3)執行階段執行編譯後的代碼。

Python和JavaScript的未來趨勢包括:1.Python將鞏固在科學計算和AI領域的地位,2.JavaScript將推動Web技術發展,3.跨平台開發將成為熱門,4.性能優化將是重點。兩者都將繼續在各自領域擴展應用場景,並在性能上有更多突破。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3漢化版
中文版,非常好用

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Atom編輯器mac版下載
最受歡迎的的開源編輯器