this

作者:李挺
鏈接:https://www.zhihu.com/question/19636194/answer/123274198
來源:知乎
著作權歸作者所有,轉載請聯系作者獲得授權。

關于 this 的描述,曾經在 stackoverflow 上看到了一篇回答寫的非常詳盡,下面的文字是一個簡單的總結:

(一)定義:是一個關鍵字,用來計算當前執行上下文中 ThisBinding 的值。
  • 定義推斷:作為一個關鍵字,既不是變量,又不是對象屬性,因此不能給 this 賦值,而且 this 也不受作用域的限制,嵌套函數中的 this 不會從調用它的函數中繼承 this。

(二)ThisBinding 的值(this 的計算結果):
  1. 全局執行上下文中——global 對象
  2. eval() 中
    • 如果 eval() 是直接調用,那么 Thisbinding 的值取決于 eval() 所處的執行上下文;
    • 如果是間接調用,那么 ThisBinding 的值為 global 對象;【注1】
3. 函數中
    • 作為普通的函數調用,為 global(非嚴格模式下)或 undefined (嚴格模式下);
    • 作為某個對象的方法調用,那么 ThisBinding 的值就是這個對象;
    • 作為構造函數調用,ThisBinding 的值為所創建的新的空對象;【注2】
    • 間接調用下,有八種函數可以在參數中指定 ThisBinding 的值
Function.prototype.apply(thisArg, argArray);
Function.prototype.call(thisArg[, arg1[, arg2, ...]]);
Function.prototype.bind(thisArg[, arg1[, arg2, ...]]);
Array.prototype.every(callbackfn[, thisArg]);
Array.prototype.some(callbackfn[, thisArg]);
Array.prototype.forEach(callbackfn[, thisArg]);
Array.prototype.map(callbackfn[, thisArg]);
Array.prototype.filter(callbackfn[, thisArg]);
      • 在 Function.prototype 下的函數,thisArg 指定其主體函數中的 ThisBinding 值;(thisArg 不一定與 ThisBinding 相等【注3】)
      • 在 Array.prototype 下的函數,thisArg 指定 callbackfn 中 ThisBinding 的值。

注解:
    1. eval 是通過表達式計算得到的,那么此時,eval 調用稱之為間接調用,eval 中的代碼在全局環境下執行。(例如:
      var x = 'outer';
      (function(){
      var x = 'inner';
      eval('console.log("直接調用: " + x)');        // 直接調用: inner
      (1, eval)('console.log("間接調用: " + x)');   // 間接調用: outer
      })();
      
    2. 構造函數的調用細節:構造函數調用之前會自動創建一個新的空對象,構造函數作為這個新對象的方法進行調用,所以構造函數通過 this 就可以初始化這個新對象,最后,這個新對象作為構造函數調用表達式的值,構造函數的 prototype 屬性作為新對象的原型。
    3. 如果這個函數處于非嚴格模式下,則指定為 null 或 undefined 時會自動指向 global 對象,同時如果 thisArg 是原始值的話,那么 ThisBinding 的值原始值的包裝對象。

引用:
    1. javascript - How does the "this" keyword work?
    2. (1,eval)('this') vs eval('this') in JavaScript?
    3. Function.prototype.apply(),Function.prototype.call(),Function.prototype.bind()
    4. 《JavaScript 權威指南》第六版

轉載于:https://www.cnblogs.com/yasepix/p/6198004.html

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

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

相關文章

DeviceNet 消息類型

DeviceNet是一種低成本的通訊總線鏈接,具有開放現場網絡標準,規范和協議都是開放的。DeviceNet將控制和數據融合在一起,信息具有數據標識區,網絡利用標識區進行優先級仲裁,可以高效傳送I/O數據。 DeviceNet有兩種不同類…

【pyqt5學習——信號與槽】實例計時器(解決界面卡頓問題)

目錄 一、方法一:另開線程 1、什么是信號與槽 1)GUI控件(信號)與槽 2)自定義信號與槽 2、實戰1:計時器(不自定義信號槽和不使用多線程) 1)界面設計——利用qt-desi…

【轉】為什么螺絲都是六角的?

6邊形的螺絲擰60度就可以圖形還原(不知道表述清楚沒,見討論中的解釋)) 如果空間比較狹小,只要扳手能擰動60度就能安裝上螺絲 這是在擰動角度和邊長相互妥協后的產物 試想 如果是正方形,邊長夠長了&#xff…

用PHP和Websocket實現實時通訊

說到websocket大家一定不會陌生,WebSocket是HTML5一種新的協議。它實現了瀏覽器與服務器全雙工通信(full-duplex)。一開始的握手需要借助HTTP請求完成,當瀏覽器和服務器握手成功后,瀏覽器和服務器之間就形成了一條快速通道。兩者之間就直接可…

ABB SocketReceive 套接口 函數

SocketReceive函數使用方法: SocketReceive 從遠程計算機接收數據。 SocketReceive 可以被客戶端和服務器程序使用。 基本樣例: 下述樣例說明了 SocketReceive 的語法: Example 1 VAR string str_data; ... SocketRe…

【數據庫學習筆記】——創建數據庫連接對象connection

目錄 connect函數的參數 創建連接對象連接MySQL代碼 連接對象常見屬性與方法 事務名詞解釋 課程視頻鏈接: 第14節 Python操作數據庫_嗶哩嗶哩_bilibili666https://www.bilibili.com/video/BV1q54y147KX?fromsearch&seid968950907021994347&spm_id_from3…

數據庫常用增刪改查記錄等語句

1增 1.1【插入單行】insert [into] <表名> (列名) values (列值)例&#xff1a;insert into Strdents (姓名,性別,出生日期) values (開心朋朋,男,1980/6/15) 1.2【將現有表數據添加到一個已有表】insert into <已有的新表> (列名) select <原表列名> from &…

一個關于pynoi游戲的C語言編程

“去吧&#xff0c;秦&#xff0c;好好享受這個夜晚&#xff0c;我給你準備了一份禮物&#xff0c;希望你能喜歡。”小布萊克眨著眼睛笑道&#xff0c;狡猾的像一頭小狐貍。轉載于:https://www.cnblogs.com/jackey18/p/8260774.html

【數據庫學習筆記】——cursor游標對象

目錄 1、創建cursor對象 2、cursor對象常用方法 3、操作數據庫的常見流程&#xff08;五部曲&#xff09; 課程視頻鏈接&#xff1a; 第14節 Python操作數據庫_嗶哩嗶哩_bilibili666https://www.bilibili.com/video/BV1q54y147KX?p2&spm_id_frompageDriver 1、創建cu…

ABB 壓包指令PackRawBytes 解包指令UnpackRawBytes

ABB 壓包指令PackRawBytes 解包指令UnpackRawBytes PackRawBytes- 將數據導入 rawbytes 數據。 使用方法 PackRawBytes 用于將 num, dnum, byte,或者 string類型的數據&#xff0c;打包到 rawbytes 類型的變量中. 基本舉例 &#xff1a; VAR rawbytes …

Android Https相關完全解析 當OkHttp遇到Https

Android Https相關完全解析 當OkHttp遇到Https轉載于:https://www.cnblogs.com/zhujiabin/p/5304617.html

基于ARM核AT75C220在指紋識別系統中應用

紋識別技術近年來逐漸成熟&#xff0c;在門禁、安防和金融等方面得到了越來越廣泛的應用。典型的指紋識別系統是以指紋傳感器和DSP處理器為核心構成。指紋傳感器采集指紋圖像&#xff0c;DSP處理器實時實現指紋識別算法。同時&#xff0c;通常的指紋識別系統還具有較強的通信能…

【數據庫學習筆記】——創建數據庫文件

目錄 1、數據庫基礎知識 2、創建數據庫文件 1、數據庫基礎知識 什么是數據庫&#xff1f;——數據庫是存放多個數據表的倉庫&#xff0c;數據表可以理解為是二維數組 如上表所示&#xff0c;每個表由行列組成&#xff1a; 字段&#xff1a;每一列稱之為一個字段&#xff0c;每…

歲月在流逝,從阿里退下來接近70后程序猿帶給我的啟示

大家好&#xff0c;今天為大家帶來一個非常勵志&#xff0c;讓我反思的故事。今天為大家講的是我父親是如何用行動教會我成為程序員的。 歲月的錘煉 圓口接口的鍵盤&#xff0c;2003年的 有人問這個鍵盤難道沒有擦過嗎&#xff1f;不是的&#xff0c;是擦不掉的歲月痕跡。如果有…

淺談工業機器人的運動停止

德系的工業機器人系統中&#xff0c;對于機器人停止運動&#xff0c;定義了3種模式&#xff0c;比如 KUKA 的工業機器人分別定義了 Stop 0 &#xff0c;Stop 1&#xff0c;Stop 2 (*注1)。這種定義模式是與機器人的機械結構和電氣結構相關聯的。 對于此&#xff0c;讀者應該先了…

MySQL 數據表備份導出,恢復導入操作實踐

因為經常跑腳本的關系&#xff0c; 每次跑完數據之后&#xff0c;相關的測試服數據庫表的數據都被跑亂了&#xff0c;重新跑腳本恢復回來速度也不快&#xff0c;所以嘗試在跑腳本之前直接備份該表&#xff0c;然后跑完數據之后恢復的方式&#xff0c;應該會方便一點。所以實踐一…

js實現去重字符串

實現去重字符串主要是把重復的字符與原來的字符&#xff08;先push()進入一個數組存起來&#xff09;相匹配&#xff0c;如果match返回的不是null則說明重復&#xff0c;就刪除掉&#xff1a; <script>var str prompt("請輸入一個字符串&#xff1a;", "…

ABB 機器人 IsStopMoveAct 指令 - Is stop move flags active

IsStopMoveAct - Is stop move flags active 用法&#xff1a; IsStopMoveAct 用于得到當前或連接運動任務的 停止移動位狀態。 is used to get the status of the stop move flags for a current or connected motion task. 基本示例&#xff1a; stopflag2:…

【數據庫學習】——數據庫可視化--Navicat下載安裝連接教程

目錄 進入網站 下載可視化軟件 安裝 雙擊桌面圖標&#xff0c;選擇試用 連接數據庫 查看數據庫中的表&#xff0c;如下所示 常用數據庫有&#xff1a; MySQL、sqlite等 進入網站 Navicat | 產品https://www.navicat.com.cn/products 下載可視化軟件 這里以數據庫sql…

機器學習筆記1(K-近鄰算法)

人生苦短&#xff0c;我用PythonK-近鄰算法&#xff1a;簡單來說&#xff0c;K-近鄰算法就是采用測量不同特征值之間的距離方法進行分類優點&#xff1a;精度高、對異常值不敏感、無數據輸入假定缺點&#xff1a;計算復雜度高、空間復雜度高適用范圍&#xff1a;數值型、標稱型…