學習筆記整理-面向對象-02-認識函數的上下文

一、認識函數的上下文

  • 什么是上下文
      垃圾分類,`這`是非常好的習慣,值得表揚隨手關燈,`這`是非常好的習慣,值得表揚遛狗栓繩,`這`是非常好的習慣,值得表揚課后復習,`這`是非常好的習慣,值得表揚 早睡早起,`這`是非常好的習慣,值得表揚
    
  • 函數的上下文
    • 函數中可以使用this關鍵字,它表示函數的上下文
    • 與中文中"這"類似,函數中的this具體指代什么必須通過調用函數時的"前言后語"來判斷
  • 函數中的this
      var xiaoming = {nickname: '小明',age: 12,sayHello: function () {console.log('我是' + this.nickname + ',我' + this.age + '歲了'); }};xiaoming.sayHello(); // 我是小明,我12歲了
    
       var xiaoming = {nickname: '小明',age: 12, sayHello: function () {console.log('我是' + this.nickname + ',我' + this.age + '歲了'); }};var sayHello = xiaoming.sayHello;  // 將函數"提"出來,單獨存為變量// 直接圓括號調用這個函數,而不是對象打點調用了sayHello(); // 我是undefined,我undefined歲了
    
  • 函數的上下文由調用方式決定
    • 同一個函數,用不同的形式調用它,則函數的上下文不同
      • 情形1:對象打點調用函數,函數中的this指代這個打點的對象
          xiaoming.sayHello();
        
      • 情形2:圓括號直接調用函數,函數中的this指代window對象
          var sayHello = xiaoming.sayHello; sayHello();
        
          var obj = { a: 1,b: 2,fn: function () {console.log(this.a + this.b);}};var fn = obj.fn;fn();
        

1. 上下文規則1

  • 函數的上下文由調用函數的方式決定

    • 函數的上下文(this關鍵字)由調用函數的方式決定, function是"運行時上下文"策略。
    • 函數如果不調用,則不能確定函數的上下文。
  • 規則1:對象打點調用它的方法函數,則函數的上下文是這個打點的對象
    對象.方法()

      function fn() {console.log(this.a + this.b);}var obj = { a: 66, b: 33, fn: fn}; obj.fn(); // 99
    
    • 構成對象.方法()的 形式,適用規則1
      var obj1 = {a: 1,b: 2,fn: function () {console.log(this.a + this.b);}};var obj2 = {a: 3,b: 4,fn: obj1.fn };obj2.fn(); // 7
    
    • 構成對象.方法()的形式,適用規則1
       function outer() { var a = 11;var b = 22;return {a: 33,b: 44,fn: function () {console.log(this.a + this.b);}}; }outer().fn(); // 77
    
    • 構成對象.方法()的 形式,適用規則1
      function fun() {console.log(this.a + this.b);}var obj = {a: 1, b: 2, c: [{a: 3, b: 4, c: fun}] };var a = 5; obj.c[0].c(); // 7
    
    • 構成對象.方法()的形式,適用規則1

2. 上下文規則2

  • 規則2:圓括號直接調用函數,則函數的上下文是window對象

      函數()
    
       var obj1 = {a: 1,b: 2,fn: function () {console.log(this.a + this.b);}};var a = 3;var b = 4;var fn = obj1.fn;fn(); // 7
    
    • 構成函數()的形式,適用規則2
      function fun() {return this.a + this.b;}var a = 1; var b = 2;var obj = {a: 3,b: fun(), // 適用規則2fun: fun};var result = obj.fun(); // 適用規則1console.log(result); // 6
    

3. 上下文規則3

  • 規則3:數組(類數組對象)枚舉出函數進行調用,上下文 是這個數組(類數組對象)

      數組[下標]()
    
      var arr = ['A', 'B', 'C', function () { console.log(this[0]);}];arr[3](); // "A"
    
    • 適用規則3
  • 什么是類數組對象:所有鍵名為自然數序列(從0開始),且有length屬性的對象。

  • arguments對象是最常見的類數組對象,它是函數的實參列表。

      function fun() {arguments[3](); }fun('A', 'B', 'C', function () { console.log(this[1]); // 'B'});
    
    • 適用規則3

4. 上下文規則4

  • 規則4:IIFE中的函數,上下文是window對象
      (function() {})();
    
      var a = 1;var obj = {a: 2,fun: (function () {var a = this.a;return function () {console.log(a + this.a); // 3} })() // 適用規則4};obj.fun(); // 適用規則1
    

5. 上下文規則5

  • 規則5:定時器、延時器調用函數,上下文是window對象
      setInterval(函數, 時間);setTimeout(函數, 時間);
    
      var obj = {a: 1,b: 2,fun: function () {console.log(this.a + this.b); // 7}}var a = 3; var b = 4;setTimeout(obj.fun, 2000); // 適用規則5
    
      var obj = {a: 1,b: 2,fun: function () {console.log(this.a + this.b); // 3}}var a = 3; var b = 4;setTimeout(function() { obj.fun(); // 適用規則1}, 2000);
    

6. 上下文規則6

  • 規則6:事件處理函數的上下文是綁定事件的DOM元素。
      DOM元素.onclick = function () {};
    
  • 請實現效果:點擊哪個盒子,哪個盒子就變紅,要求使用同一個事件處理函數實現。
    @code
  • 請實現效果:點擊哪個盒子,哪個盒子在2000毫秒后就變紅,要求使用同一個事件處理函數實現。
    @code

7. call 和 apply

  • callapply能指定函數的上下文。

      function sum() {alert(this.chinese + this.math + this.english);}var xiaoming = { chinese: 80,math: 95,english: 93};sum.call(xiaoming);sum.apply(xiaoming);
    
    • 函數.call(上下文);
    • 函數.apply(上下文);
  • callapply的區別

      function sum(b1, b2) {alert(this.c + this.m + this.e + b1 + b2);}sum.call(xiaoming, 5, 3); // call要用逗號羅列參數xsum.apply(xiaoming, [5, 3]); // apply要把參數寫到數組中
    
  • 到底使用call還是apply?

      function fun1() {fun2.apply(this, arguments);}function fun2(a, b) {alert(a + b);}fun1(33, 44);
    

8. 總結

規則上下文
對象.函數()對象
函數()window
數組[下標]()數組
IIFEwindow
定時器window
DOM事件處理函數綁定DOM的元素
call和apply任意指定

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

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

相關文章

【數據結構】單鏈表OJ題(二)

🔥博客主頁:小王又困了 📚系列專欄:數據結構 🌟人之為學,不日近則日退 ??感謝大家點贊👍收藏?評論?? 目錄 一、鏈表分割 💡方法一: 二、鏈表的回文 &#x…

hosts文件中被添加 windows10.microdone.cn

在網上搜了一圈逗說是之前下過征信中心的安全控件,是微通新成網絡科技有限公司這家公司提供的,也是http://microdone.cn的運營商。后邊只要使用代理,就會跳出來,所以常規處理操作就是去把瀏覽器上的安全控件卸載了。 參考 解決 windows10 的 代理頻繁被自動篡改為windows10.mi…

利用python實現激光雷達LAS數據濾波的7種方式,使用laspy讀寫

激光雷達(LiDAR)數據在實際應用中可能受到噪聲和不完美的測量影響,因此數據去噪和濾波方法變得至關重要,以提高數據質量和準確性。以下是一些常用的激光雷達數據去噪與濾波方法。 原始數據如下: 1. 移動平均濾波&…

kubernetes中PV和PVC

目錄 一、PV、PVC簡介 二、PV、PVC關系 三、創建靜態PV 1.配置nfs存儲 2.定義PV 3.定義PVC 4.測試訪問 四、 搭建 StorageClass nfs-client-provisioner ,實現 NFS 的動態 PV 創建 1. 配置nfs服務 2.創建 Service Account 3.使用 Deployment 來創建 NFS P…

Figma中文社區來啦,云端協作設計你準備好了嗎?

Figma是改變產品設計協作方式的重要工具,但由于沒有中文社區,對國內設計師的約束較大。而擁有全中文UI 界面、功能齊全的即時設計資源廣場,恰好彌補了Figma的這一短板,它也將取代Figma成為設計師新寵。 1、UI組件集 Figma中文社區替代即時設計資源廣場,擁有海量豐富的UI設計組…

【BEV Review】論文 Delving into the Devils of Bird’s-eye-view 2022-9 筆記

背景 一般來說,自動駕駛車輛的視覺傳感器(比如攝像頭)安裝在車身上方或者車內后視鏡上。無論哪個位置,攝像頭所得到的都是真實世界在透視視圖(Perspective View)下的投影(世界坐標系到圖像坐標系…

ssm柚子云電子商城java圖書購物電子商務管理jsp源代碼

本項目為前幾天收費幫學妹做的一個項目,Java EE JSP項目,在工作環境中基本使用不到,但是很多學校把這個當作編程入門的項目來做,故分享出本項目供初學者參考。 一、項目描述 ssm柚子云電子商城 系統有2權限:前臺、后…

SpringBoot筆記:SpringBoot 集成 Dataway 多數據源配置(二)

文章目錄 前言核心代碼和配置yml 配置注入多數據源常用Spi實現swagger 配置自定義 Udf指定數據源進行查詢 前言 之前簡單介紹了一下 Dataway 使用,本文繼續介紹一下它的多數據源配置和使用。 核心代碼和配置 yml 配置 # springboot多環境配置 #端口,…

JavaScript應用:五子棋游戲實戰開發

🏆作者簡介,黑夜開發者,全棧領域新星創作者?,CSDN博客專家,阿里云社區專家博主,2023年6月csdn上海賽道top4。 🏆數年電商行業從業經驗,歷任核心研發工程師,項目技術負責…

面試熱題(螺旋矩陣)

給你一個 m 行 n 列的矩陣 matrix ,請按照 順時針螺旋順序 ,返回矩陣中的所有元素 一看到這個大家有沒有想到 就是一個螺旋形狀,那這道題我們應該怎么解決? 我們先來仔細的看,它這種螺旋形狀的遍歷是先【右-下-左-上】…

Docker中Tomcat部署步驟

第一次訪問沒有東西。

為什么我不推薦任何人用C語言作為編程啟蒙第一課?

前言 寫了20多年的代碼,之前做過阿里的高級架構師,在技術這條路上跌跌撞撞了很多,我今天分享一些我個人的自學方法給各位。為什么我會說:不推薦任何人用C語言作為編程啟蒙第一課? 這里有很多同學要站出來說了&#x…

實現CP指令

一、文件的打開創建 #include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int open(const char *pathname, int flags); flags: O_RDONLY 只讀 O_WRONLY 只寫 O_RDWR 可讀可寫 int open(const char *pathname, int flags, mode_t mode); 如果 …

VsCode美化 - VsCode自定義 - VsCode自定義背景圖

VsCode美化 - VsCode自定義 - VsCode自定義背景圖&#xff1a;添加二次元老婆圖到VsCode 前言 作為一個二刺螈&#xff0c;VsCode用久了&#xff0c;總覺得少了些什么。是啊&#xff0c;高效的代碼生產工具中怎么能沒有老婆呢&#xff1f; 那就安裝一個VsCode插件把老婆添加…

章節7:Burp Intruder模塊

章節7&#xff1a;Burp Intruder模塊 參考資料 https://portswigger.net/burp/documentation/desktop/tools/intruder 01 Intruder模塊作用與原理 原理 http://xxx.xx.com/bbs/index.php?namewuyanzu&mottogo 對請求參數進行修改&#xff0c;分析響應內容&#xff0…

Linux 內核第一版 (v0.01) 開源代碼解讀

探索Linux v0.01的內部結構&#xff0c;Linux內核經常被認為是一個龐大的開源軟件。在撰寫本文時&#xff0c;最新版本是v6.5-rc5&#xff0c;包含36M行代碼。不用說&#xff0c;Linux是幾十年來許多貢獻者辛勤工作的成果。 Linux 內核首個開源版本 (v0.01) 的體積非常小&…

四、Dubbo擴展點加載機制

四、Dubbo擴展點加載機制 4.1 加載機制概述 Dubbo良好的擴展性與框架中針對不同場景使用合適設計模式、加載機制密不可分 Dubbo幾乎所有功能組件都是基于擴展機制&#xff08;SPI&#xff09;實現的 Dubbo SPI 沒有直接使用 Java SPI&#xff0c;在它思想上進行改進&#xff…

競賽項目 深度學習的視頻多目標跟蹤實現

文章目錄 1 前言2 先上成果3 多目標跟蹤的兩種方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟蹤過程4.1 存在的問題4.2 基于軌跡預測的跟蹤方式 5 訓練代碼6 最后 1 前言 &#x1f525; 優質競賽項目系列&#xff0c;今天要分享的是 基于深度學習的視頻多目標跟蹤實現 …

全網最牛,Appium自動化測試框架-關鍵字驅動+數據驅動實戰(二)

目錄&#xff1a;導讀 前言一、Python編程入門到精通二、接口自動化項目實戰三、Web自動化項目實戰四、App自動化項目實戰五、一線大廠簡歷六、測試開發DevOps體系七、常用自動化測試工具八、JMeter性能測試九、總結&#xff08;尾部小驚喜&#xff09; 前言 util 包 util 包…

數據可視化工具LightningChart .NET正式發布v10.5.1——擁有全新的3D新功能

LightningChart.NET完全由GPU加速&#xff0c;并且性能經過優化&#xff0c;可用于實時顯示海量數據-超過10億個數據點。 LightningChart包括廣泛的2D&#xff0c;高級3D&#xff0c;Polar&#xff0c;Smith&#xff0c;3D餅/甜甜圈&#xff0c;地理地圖和GIS圖表以及適用于科學…