【二】JavaScript能力提升---this對象

目錄

this的理解

this的原理

事件綁定中的this

行內綁定

動態綁定

window定時器中的this


相信小伙伴們看完這篇文章,對于this的對象可以有一個很大的提升!

this的理解

對于this指針,可以先記住以下兩點:

  1. this永遠指向一個對象
  2. this的指向完全取決于函數調用的位置

對于第一點,不管在什么地方使用this,它必然會指向某個對象。

由于在JavaScript中,一切皆對象,運行環境也是對象,所以函數都是在某個對象下運行,而this就是“函數運行時所在的對象(環境)

但因為JavaScript支持運行環境動態切換,即:this的指向是動態的,很難確定this到底指向哪個對象,這是最讓我們感到困惑的地方。

this的原理

function fun()
{console.log(this.s);
}var obj = {s:'1',f:fun
}var s = '2';obj.f(); // 1
fun(); // 2

JS中,數組、函數、對象都是引用類型,在參數傳遞時也就是引用傳遞(傳遞內存地址)。

在上面代碼中,obj有兩個屬性,但是f屬性存儲了一個函數名(函數的內存地址),于是在調用f方法時,通過f的值找到對應的內存地址就調用到了對應的函數。

下圖是obj在內存中的表示:

在調動時就變成了下面這個樣子:

下面,我們一條一條解釋,相信看完這些解釋,你會恍然大悟

關于obj.f()的調用

  • 調用objf方法時,js引擎先找到obj這個對象,隨后在obj內存地址中找到f方法的地址,再調用f方法地址中的值(在這里這個值就是functiuon fun()這個函數的內存地址),于是成功調用這個函數。但由于該函數是經過:“js引擎 -> obj對象 ->f()”這么一個順序調用的,因此此時fun()this指向它的運行環境,即obj對象

關于fun()的調用

  • 調用fun()時,js引擎要在整個<script>標簽下搜尋“函數名為fun的函數”,因為是在整個<script>標簽搜尋,故搜索到fun()函數時,運行環境固然在window對象下,該函數經過:“js引擎 ->?整個<script>環境(window對象) -> fun()”這個一個順序調用的
var A = {name:'張三',f:function(){console.log('姓名:'+this.name);}
};var B = {name:"李四"
};B.f = A.f;
B.f(); // 姓名:李四
A.f(); // 姓名:張三

上面代碼,仍然可以用我上面所說的來解釋:

由于“函數”的傳遞是“引用傳遞”(傳遞內存地址),即此時B.f的值就是匿名函數的內存地址,故B.f()A.f()實際上調用的是“同一個內存地址的同一個函數

  • 調用B.f()時,js引擎根據B.f的值,找到對應的匿名函數,此時匿名函數的執行環境在B對象之下,故打印“李四”
  • 調用A.f()時,js引擎根據A.f的值,找到對應的匿名函數,此時匿名函數的執行環境在A對象之下,故打印“張三”

function foo()
{console.log(this.a);
}var obj2 = {a:2,f:foo
};var obj1 = {a:1,o:obj2
};obj1.o.f(); // 2

對于上面代碼,仍仍仍然可以使用剛才所說的來解釋:

  • 調用obj1.o.f()時,js引擎根據obj1.o(obj2的內存地址)先找到obj2對象,再根據f(foo的內存地址)找到foo,最后執行foo。此時整個調用關系為:“js引擎 -> obj1對象 -> obj2對象 -> foo()”,故foo運行在obj2對象之下,因此打印2

事件綁定中的this

事件綁定有三種方式:行內綁定動態綁定事件監聽

行內綁定

<input type="button" value="按鈕" onclick="clickFun()">
<script>function clickFun(){this // window}
</script>
?
<input type="button" value="按鈕" onclick="this">
<!-- 本節點對象 -->

節點事件屬性的值可以是:“可執行的JS代碼段”或“函數名(函數調用)

對于οnclick="clickFun()"

  • JS引擎發現onclick的值是函數調用,因此轉去<script>標簽下(window環境)尋找函數名為“clickFun”的函數,找到clickFun函數后成功執行。此時執行順序為:“JS引擎 -> <script>標簽 -> clickFun()

對于οnclick="this"

  • JS引擎發現onclick的值是一段可執行的js代碼,因此JS引擎直接在該DOM節點下執行該代碼,對應的this就指向該節點了

動態綁定

<input type="button" value="按鈕" id="btn">
<script>var btn = document.getElementById('btn');btn.onclick = function(){this ;  // this指向btn節點對象}
</script>

這里的操作,本質上是直接對btn節點對象的onclick屬性附一個值

當執行時,JS引擎發現onclick屬性的值是一個匿名函數,因此直接就執行該匿名函數。

又因為該匿名函數的是在btn對象之下執行的,因此this執行btn節點對象

window定時器中的this

var obj = {fun:function(){this ;}
}
?
setInterval(obj.fun,1000);      // window對象
setInterval('obj.fun()',1000);  // obj對象

對于obj.fun:

注意:在這里有一個很重要的點,這里傳入的是obj.fun,而不是obj.fun(),傳遞obj.fun是傳入的fun這個方法函數(可以理解為傳入fun的值,而fun的值是一個匿名函數,即匿名函數的地址)。而obj.fun是直接調用obj.fun()方法

  • 在經過1s后,JS引擎發現setInerval的第一個參數值是一個函數地址,因此轉而去執行該函數。但由于setInterval是一個異步函數,在等待時,會將該代碼段掛載到全局對象(window對象)下的一個棧中,因此執行過程為:“JS引擎 ->?window對象下的棧 ->?匿名函數”,故this指向window對象

對于'obj.fun()'

  • 在經過1s后,JS引擎發現setInterval的第一個參數值是一段可執行的JS代碼,轉而執行這個代碼,這個代碼是調用obj.fun()對象,因此JS引擎去<script>標簽(window)下找到obj對象,在找到fun方法,最后執行匿名函數。因此執行過程為:“JS引擎 ->?window對象 -> obj對象 ->?匿名函數”,故this指向obj對象

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

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

相關文章

使用vue3.0+electron搭建桌面應用并打包exe

使用vue3.0electron搭建桌面應用并打包exe_如何使用electron將vue3vite開發完的項目打包成exe應用程序-CSDN博客

linux如何判斷進程對磁盤是隨機寫入還是順序寫入?

模擬工具&性能測試工具&#xff1a;fio fio參數說明&#xff1a; filename/dev/sdb1&#xff1a;測試文件名稱&#xff0c;通常選擇需要測試的盤的data目錄。 direct1&#xff1a;是否使用directIO&#xff0c;測試過程繞過OS自帶的buffer&#xff0c;使測試磁盤的結果更真…

STM32基礎教程——對射式紅外傳感器計數實驗

前言 對射式紅外傳感器介紹 對射式紅外傳感器是一種非接觸式的距離檢測器&#xff0c;主要由發射器和接收器兩部分組成。發射器發出特定波長的紅外光束&#xff0c;當物體阻擋了這條光束時&#xff0c;接收器無法接收到光線信號&#xff0c;從而產生一個開關信號來判斷物體的存…

Hive-優化(語法優化篇)

列裁剪與分區裁剪 在生產環境中&#xff0c;會面臨列很多或者數據量很大時&#xff0c;如果使用select * 或者不指定分區進行全列或者全表掃描時效率很低。Hive在讀取數據時&#xff0c;可以只讀取查詢中所需要的列&#xff0c;忽視其他的列&#xff0c;這樣做可以節省讀取開銷…

rkipc控制ircut的分析

rk_isp_set_night_to_day函數 rkipc控制ircut主要通過rk_isp_set_night_to_day函數&#xff0c;例如在ser_rk_isp_set_night_to_day函數中 int ser_rk_isp_set_night_to_day(int fd) {int ret 0;int id, len;char *value NULL;if (sock_read(fd, &id, sizeof(id)) SOC…

Android Retrofit + RxJava + OkHttp 網絡請求高效封裝方案

Retrofit RxJava OkHttp 是 Android 開發中常用的網絡請求庫組合。Retrofit 是一個類型安全的 HTTP 客戶端&#xff0c;RxJava 是一個響應式編程庫&#xff0c;OkHttp 是一個高效的 HTTP 客戶端。 Retrofit RxJava OkHttp 的組合可以提供以下功能&#xff1a; 職責清晰 R…

【nRF52832】【Nodic】開發入門【三】模塊化

title: nRF52832開發入門【二】模塊化 tags: nodic categories: nodic abbrlink: 37752 date: 2025-03-09 17:22:17 1. 介紹 我們實際開發過程中往往會很復雜&#xff0c;為了更好的管理代碼&#xff0c;我們需要模塊化。模塊化的好處有很多&#xff0c;比如&#xff1a; 降…

爬蟲案例八js逆向爬取網易音樂

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、js逆向的前期準備二、網站分析三、代碼 前言 提示&#xff1a;這里可以添加本文要記錄的大概內容&#xff1a; 爬取網易音樂 提示&#xff1a;以下是本篇…

vue2實現組件庫的自動按需引入,unplugin-auto-import,unplugin-vue-components

1.使用ant-design-vue或者element-ui時&#xff0c;如何每個組件都去import導入組件&#xff0c;大大降低了開發效率&#xff0c;如果全局一次性注冊會增加項目體積&#xff0c;那么如何實現既不局部引入&#xff0c;也不全局注冊&#xff1f; 2.在element-plus官網看到有說明…

【Andrej Karpathy 神經網絡從Zero到Hero】--2.語言模型的兩種實現方式 (Bigram 和 神經網絡)

目錄 統計 Bigram 語言模型質量評價方法 神經網絡語言模型 【系列筆記】 【Andrej Karpathy 神經網絡從Zero到Hero】–1. 自動微分autograd實踐要點 本文主要參考 大神Andrej Karpathy 大模型講座 | 構建makemore 系列之一&#xff1a;講解語言建模的明確入門&#xff0c;演示…

(二 十 二)趣學設計模式 之 備忘錄模式!

目錄 一、 啥是備忘錄模式&#xff1f;二、 為什么要用備忘錄模式&#xff1f;三、 備忘錄模式的實現方式四、 備忘錄模式的優缺點五、 備忘錄模式的應用場景六、 總結 &#x1f31f;我的其他文章也講解的比較有趣&#x1f601;&#xff0c;如果喜歡博主的講解方式&#xff0c;…

安裝SPSS后啟動顯示應用程序無法啟動,因為應用程序的并行配置不正確的解決方案

軟件安裝報錯問題有需要遠程文章末尾獲取聯系方式&#xff0c;可以幫你遠程處理各類安裝報錯。 一、安裝SPSS后啟動顯示應用程序無法啟動&#xff0c;因為應用程序的并行配置不正確報錯 在成功安裝 SPSS 軟件后&#xff0c;嘗試啟動應用程序時&#xff0c;系統彈出錯誤提示窗…

IP,MAC,ARP 筆記

1.什么是IP地址 IP 地址是一串由句點分隔的數字。IP 地址表示為一組四個數字&#xff0c;比如 192.158.1.38 就是一個例子。該組合中的每個數字都可以在 0 到 255 的范圍內。因此&#xff0c;完整的 IP 尋址范圍從 0.0.0.0 到 255.255.255.255。 IP 地址不是隨機的。它們由互…

C++11中的Condition_variable

C11中的condition_variable 在C11中&#xff0c;條件變量&#xff08;std::condition_variable&#xff09;是線程同步機制之一&#xff0c;用于在多線程環境中實現線程間的通信和協調。它允許一個或多個線程在某個條件尚未滿足時等待&#xff0c;直到其他線程通知條件已經滿足…

IO多路復用實現并發服務器

一.select函數 select 的調用注意事項 在使用 select 函數時&#xff0c;需要注意以下幾個關鍵點&#xff1a; 1. 參數的修改與拷貝 readfds 等參數是結果參數 &#xff1a; select 函數會直接修改傳入的 fd_set&#xff08;如 readfds、writefds 和 exceptfds&#xf…

_二級繼電器程控放大倍數自動設置

簡介 在開發項目中&#xff0c;有時會遇到需要使用程控放大的情況&#xff0c;如果沒有opa那種可編程放大器&#xff0c;那么就需要通過繼電器來控制放大倍數。而在繼電器程控中&#xff0c;常用的是二級程控&#xff0c;三級程控相較于二級就復雜了許多。 在二級程控中&#x…

電腦總顯示串口正在被占用處理方法

1.現象 在嵌入式開發過程中&#xff0c;有很多情況下要使用串口調試&#xff0c;其中485/422/232轉usb串口是非常常見的做法。 根據協議&#xff0c;接口芯片不同&#xff0c;需要安裝對應的驅動程序&#xff0c;比如ch340&#xff0c;cp2102&#xff0c;CDM212364等驅動。可…

優雅拼接字符串:StringJoiner 的完整指南

在Java開發中&#xff0c;字符串拼接是高頻操作。無論是日志格式化、構建CSV數據&#xff0c;還是生成動態SQL&#xff0c;開發者常需處理分隔符、前綴和后綴的組合。傳統的StringBuilder雖然靈活&#xff0c;但代碼冗余且易出錯。Java 8推出的StringJoiner類&#xff0c;以簡潔…

LabVIEW閉環控制系統硬件選型與實時性能

在LabVIEW閉環控制系統的開發中&#xff0c;硬件選型直接影響系統的實時性、精度與穩定性。需綜合考慮數據采集速度&#xff08;采樣率、接口帶寬&#xff09;、計算延遲&#xff08;算法復雜度、處理器性能&#xff09;、輸出響應時間&#xff08;執行器延遲、控制周期&#x…

Hive的架構

1. 概念 Hive 是建立在 Hadoop 上的數據倉庫工具&#xff0c;旨在簡化大規模數據集的查詢與管理。它通過類 SQL 語言&#xff08;HiveQL&#xff09;將結構化數據映射為 Hadoop 的 MapReduce&#xff0c;適合離線批處理&#xff0c;尤其適用于數據倉庫場景。 2. 數據模型 表&a…