【js】this指向問題

1.首先先明確,this會出現在哪里。

this出現在全局作用域中,或函數作用域中(普通函數、箭頭函數)。
對象是不產生作用域的,對象的{}和函數的{}不一樣,this并不會直接出現在對象或類中,只會出現在對象/類的函數中。

2.this指向哪里

this在全局作用域下指向的是window。
this在函數中指向的比較復雜, 滿足以下四點:
1.函數在調用時,JavaScript會默認給this綁定一個值;
2.this的綁定和定義的位置(編寫的位置)沒有關系;
3.this的綁定和調用方式以及調用的位置有關系;
4.this是在運行時被綁定的;

3.this的綁定規則

以下指的規則都是普通函數中的,不包括箭頭函數。

1.默認綁定
如果一個函數調用是直接調用,比如fn()這樣,沒有對象.fn(),就說它是默認綁定的,通常默認綁定時,函數中的this指向全局對象(window);
且要找到函數真正的調用位置,看它是否是獨立函數直接調用。

function foo() {console.log(this); // window
}foo();

2.隱式綁定
通過某個對象進行調用的。比如對象.fn()。通過某個對象發起的函數調用。這時候this會被綁定在該對象身上

function foo() {console.log(this); // obj對象
}var obj = {name: "why",foo: foo
}obj.foo();

上面提到要找到函數真正的調用位置,看它是否是獨立函數直接調用。
下面舉個例子,這個實際的調用位置其實是直接調用的。

function foo() {console.log(this);
}var obj1 = {name: "obj1",foo: foo
}// 講obj1的foo賦值給bar
var bar = obj1.foo;
bar();

3.顯式綁定
通過apply、call、bind進行綁定就是顯式綁定

function foo() {console.log(this);
}foo.call(window); // window
foo.call({name: "why"}); // {name: "why"}
foo.call(123); // Number對象,存放時123

4.new綁定
使用new,這個新對象會綁定到函數調用的this上。
綁定的this是這個類/構造函數的實例對象。

// 創建Person
function Person(name) {console.log(this); // Person {}this.name = name; // Person {name: "why"}
}var p = new Person("why");
console.log(p);

4.特殊的this

1.setTimeout
setTimeout內部如果傳的是普通函數,那這個this指向的是window。
這和setTimeout源碼的內部調用有關,記住就好了。

setTimeout(function() {console.log(this); // window
}, 1000);

2.forEach
內部傳普通函數,this指向的也是window。

var names = ["abc", "cba", "nba"];
names.forEach(function(item) {console.log(this); // 三次window
});

3.dom節點
this指向的是綁定事件的節點。

var box = document.querySelector(".box");
box.onclick = function() {console.log(this); // box對象
}

4.箭頭函數
箭頭函數沒有this,也就是不綁定this,如果在箭頭函數中使用this,則是根據外層作用域來決定this。
所以與上面的setTimeout、forEach特點結合,經常在setTimeout、forEach中使用箭頭函數。

var obj = {data: [],getData: function() {setTimeout(() => {// 模擬獲取到的數據var res = ["abc", "cba", "nba"];this.data.push(...res);}, 1000);}
}obj.getData();

這里,setTimeout中通過箭頭函數調用this,這個this與外層作用域相同,也就是和在getData函數中使用this的指向相同。

但如果getData也是個箭頭函數,那么getData函數中使用this的指向 與 外層作用域相同,也是與全局作用域中的this一致,window。

var obj = {data: [],getData: () => {setTimeout(() => {console.log(this); // window}, 1000);}
}obj.getData();

5.規則優先級

new綁定 > 顯式綁定(bind)> 隱式綁定 > 默認綁定

1.new綁定和call、apply是不允許同時使用的,所以不存在誰的優先級更高
但new綁定優先級高于bind

function foo() {console.log(this);
}var obj = {name: "obj"
}// var foo = new foo.call(obj);
var bar = foo.bind(obj);
var foo = new bar(); // 打印foo, 說明使用的是new綁定

2.new綁定優先級高于隱式綁定

function foo() {console.log(this);
}var obj = {name: "why",foo: foo
}new obj.foo(); // foo對象, 說明new綁定優先級更高

3.顯式綁定優先級高于隱式綁定

function foo() {console.log(this);
}var obj1 = {name: "obj1",foo: foo
}var obj2 = {name: "obj2",foo: foo
}// 隱式綁定
obj1.foo(); // obj1
obj2.foo(); // obj2// 隱式綁定和顯式綁定同時存在
obj1.foo.call(obj2); // obj2, 說明顯式綁定優先級更高

參考:前端面試之徹底搞懂this指向

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/40738.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40738.shtml
英文地址,請注明出處:http://en.pswp.cn/web/40738.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android SurfaceFlinger——屏幕狀態初始化(二十二)

對于開機啟動動畫前期準備的相關步驟,我們已經分析了前 5 個,對于第 6 步調用 eglGetDisplay() 函數對 OpenGL ES 初始化并獲取默認屏幕,我們在介紹 OpenGL ES 的時候也進行了詳細的分析,下一步我們我們來分析對屏幕的狀態進行初始化。 1)getInternalDisplayToken:獲取顯…

pycharm小游戲制作

以下是一個使用 Python 和 PyGame庫在 PyCharm中創建一個簡單的小游戲(貪吃蛇游戲)的示例代碼,希望對您有所幫助: import pygame import random# 基礎設置 # 屏幕高度 SCREEN_HEIGHT 480 # 屏幕寬度 SCREEN_WIDTH 600 # 小方格…

Java | Leetcode Java題解之第212題單詞搜索II

題目&#xff1a; 題解&#xff1a; class Solution {int[][] dirs {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};public List<String> findWords(char[][] board, String[] words) {Trie trie new Trie();for (String word : words) {trie.insert(word);}Set<String> a…

VitePress美化

參考資料&#xff1a; https://blog.csdn.net/weixin_44803753/article/details/130903396 https://blog.csdn.net/qq_30678861/category_12467776.html 站點信息修改 首頁部分的修改基本都在.vitepress/config.mts,這個文件內修改。 title 站點名稱 description 描述 top…

運維團隊指南:完善監控指標與優化報警機制

隨著業務規模的不斷擴大和系統復雜度的日益增加&#xff0c;運維團隊面臨著前所未有的挑戰。為了保障系統的穩定性和高效運行&#xff0c;完善監控指標與優化報警機制成為了運維工作中的重中之重。本文將結合運維行業動態&#xff0c;就如何完善監控指標體系、優化報警機制等方…

RedHat運維-Linux SSH基礎3-sshd守護進程

1. sshd這個守護進程提供了OpenSSH服務&#xff0c;請問可以通過編輯哪些配置文件&#xff0c;來配置這個服務呢&#xff1f;________________________ 2. sshd這個守護進程提供了OpenSSH服務&#xff0c;請問可以通過編輯哪些配置文件&#xff0c;來配置這個服務呢&#xff1f…

Java springboot校園管理系統源碼

Java springboot校園管理系統源碼-014 下載地址&#xff1a;https://download.csdn.net/download/xiaohua1992/89364089 技術棧 運行環境&#xff1a;jdk8 tomcat9 mysql5.7 windows10 服務端技術&#xff1a;Spring Boot Mybatis VUE 使用說明 1.使用Navicati或者其它工…

怎么樣調整分類的閾值

調整分類模型的閾值是改變模型對正負類的預測標準的一種方法&#xff0c;常用于提高精確率、召回率或者其他性能指標。以下是如何調整分類閾值的步驟和方法&#xff1a; PS&#xff1a;閾值是針對預測概率&#xff08;表示樣本屬于某個特定類別的可能性&#xff09;來說的 調…

Midjourney 如何使用參考圖像來提升圖像的準確性和相似度?

????圖像提示 ?????♂? 您可以使用圖像作為提示的一部分來影響作業的構圖、樣式和顏色。圖像提示可以單獨使用,也可以與文本提示一起使用 - 嘗試組合具有不同樣式的圖像以獲得最令人興奮的結果。 ???實際圖像提示操作步驟 點擊加號按鈕,雙擊上傳文件,把小黃貓…

超級好用的java http請求工具

kong-http 基于okhttp封裝的輕量級http客戶端 使用方式 Maven <dependency><groupId>io.github.kongweiguang</groupId><artifactId>kong-http</artifactId><version>0.1</version> </dependency>Gradle implementation …

ePTFE膜(膨體聚四氟乙烯膜)應用前景廣闊 本土企業技術水平不斷提升

ePTFE膜&#xff08;膨體聚四氟乙烯膜&#xff09;應用前景廣闊 本土企業技術水平不斷提升 ePTFE膜全稱為膨體聚四氟乙烯膜&#xff0c;指以膨體聚四氟乙烯&#xff08;ePTFE&#xff09;為原材料制成的薄膜。ePTFE膜具有耐化學腐蝕、防水透氣性好、耐候性佳、耐磨、抗撕裂等優…

自然語言處理(NLP)—— 期末復習總

1. 結構主義方法The structural Approach 1.1 語素學Graphemics/音素學phonemics 音素phonemes、書面符號written signs、字符character。這一部分關注語言的最小聲音單位&#xff08;音素phonemes&#xff09;以及這些聲音如何通過書面符號written signs或字符character來表示…

如何做到高級Kotlin強化實戰?(二)

高級Kotlin強化實戰&#xff08;二&#xff09; 2.Kotlin 與 Java 比較 2.Kotlin 與 Java 比較 2.5 字符串拼接 //Java String firstName "Android"; String lastName "enginner"; String message "My name is: " firstName " "…

Web美食分享平臺的系統-計算機畢業設計源碼45429

基于Web美食分享平臺的系統設計與實現 摘 要 本研究基于Spring Boot框架&#xff0c;設計并實現了一個Web美食分享平臺&#xff0c;旨在為用戶提供一個交流分享美食體驗的社區平臺。該平臺涵蓋了用戶注冊登錄、美食制作方法分享發布、點贊評論互動等功能模塊&#xff0c;致力于…

3D Web輕量化平臺HOOPS Web Platform的功能與應用分析

隨著3D技術在多個行業的廣泛應用&#xff0c;對于3D模型輕量化的需求日益增長。HOOPS Web Platform作為一個先進的3D模型輕量化平臺&#xff0c;為開發人員提供了一整套工具來構建和部署基于Web的工程應用程序。本文將分析HOOPS Web Platform的核心功能和它在不同領域的應用情況…

軟件工程學面向對象

一、面向對象方法學概述 傳統的生命周期方法學在消除軟件非結構化、促進軟件開發工程化方面起了積極的作用&#xff0c;但仍有許多不足&#xff0c;存在的主要問題有&#xff1a;①生產率提高的幅度不能滿足需要&#xff1b; ②軟件重用程度很低&#xff1b; ③軟件很難維護&a…

MySQL中的MVCC解析

MySQL中的MVCC解析 多版本并發控制是MySQL中實現高并發的一種關鍵技術。通過對數據進行多版本的管理&#xff0c;MVCC能夠在保證數據一致性的同時&#xff0c;提高數據庫的并發性能。本文將深入探討MySQL中的MVCC機制&#xff0c;包括其原理、實現方式以及優勢。 MVCC的原理 …

華為機試HJ22汽水瓶

華為機試HJ22汽水瓶 題目&#xff1a; 某商店規定&#xff1a;三個空汽水瓶可以換一瓶汽水&#xff0c;允許向老板借空汽水瓶&#xff08;但是必須要歸還&#xff09;。 小張手上有n個空汽水瓶&#xff0c;她想知道自己最多可以喝到多少瓶汽水。 想法&#xff1a; 因為可以…

硬件開發工具Arduino IDE

招聘信息共享社群 關聯上篇文章樂鑫ESPRESSIF芯片開發簡介 Arduino IDE&#xff08;集成開發環境&#xff09;是為Arduino硬件開發而設計的一款軟件&#xff0c;它提供了一個易于使用的圖形界面&#xff0c;允許用戶編寫、編輯、編譯和上傳代碼到Arduino開發板。Arduino IDE的…

深入分析 Android BroadcastReceiver (八)

文章目錄 深入分析 Android BroadcastReceiver (八)1. 系統與自定義實現1.1 系統廣播機制1.1.1 系統廣播的實現原理1.1.2 系統廣播的源碼分析 1.2 自定義廣播機制1.2.1 自定義廣播的實現步驟1.2.2 自定義廣播的源碼分析 2. 廣播機制設計的初衷與優勢2.1 設計初衷2.2 優勢 3. 總…