JavaScript之this的工作原理

来源:http://www.cnblogs.com/WhiteM/archive/2017/09/07/7486408.html
-Advertisement-
Play Games

JavaScript 有一套完全不同於其它語言的對 this 的處理機制。 在五種不同的情況下 ,this 指向的各不相同。 1。全局範圍內 當在全部範圍內使用 this,它將會指向全局對象。 2。函數調用 這裡 this 也會指向全局對象,可以這麼理解 在這裡,我們可以這麼理解沒有明確的調用對象的 ...


 JavaScript 有一套完全不同於其它語言的對 this 的處理機制。

種不同的情況下 ,this 指向的各不相同。

1。全局範圍內

 

當在全部範圍內使用 this,它將會指向全局對象。

2。函數調用

這裡 this 也會指向全局對象,可以這麼理解

在這裡,我們可以這麼理解沒有明確的調用對象的時候,函數的this還是在全局範圍內,所以這裡的this綁定到全局的window對象

 3。對象方法的調用

故名思義,這裡的this是在對象中的

我們在控制臺中列印

這裡的this指向的是對象obj

當然了下麵這種情況, this指向的也是obj

所以,可以這麼理解,函數在對象內部或者在對象外部定義,實現的效果一樣

就是說this指向的對象同樣都是obj

作為對象屬性的函數,對於對象來說是獨立的


當然了,對象中this也會存在綁定丟失的問題

這裡可以看到this指向的並不是obj對象,而是外部的全局環境

所以,我們可以看到在某些情況下(賦值操作),this的隱式綁定所存在的this綁定丟失的問題。

就是執行“ func= obj.b”之後func的調用和obj.b調用的結果是不同的因為這個函數賦值的過程無法把b所綁定的this也傳遞過

所以在這種情況下,this綁定丟失之後導致的問題是,這個時候this無法指向obj對象,而指向了全局環境,所以a的結果就為2

那麼怎麼解決呢? 這個時候需要用到this的顯示綁定   顯示綁定就是使用 Function.prototype 上的 call 或者 apply 方法時,函數內的 this將會被 顯示設置為函數調用的第一個參數。   我們看代碼    

在使用了call或者apply方法之後,原本因為賦值操作導致func函數內丟失的指向obj對象的this,現在確實又指向了obj對象

通過this的顯示綁定,就解決了this綁定丟失的問題

 當然瞭如果覺得每次調用多敲幾個字母,會麻煩,可以封裝一下這個調用方法

當然了,還可以追求簡單,可以不用封裝,寫的更簡單一點

我們可以使用bind()方法來綁定,就不需要再寫一個函數用來封裝一句代碼了

這裡我們也可以看出使用bind和call(apply),這兩種方式來綁定this,還是有所區別的

bind:是提供了一個可執行的函數,但是本身並會自執行,還需要我們手動執行

call(apply):提供了一個立即執行的函數,綁定的同時也執行了該函數

好,我們繼續往下看

在對象中調用的時候,如果出現 對象裡面還有對象,多層嵌套之後,this是指向哪個對象呢?

我們可以看到,在不同的對象中執行函數,this指向的作用域也不一樣,所以這點要切記

4。調用構造函數

執行new操作的時候,將創建一個新的對象,並且將構造函數的this指向所創建的新對象

 

   
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...