成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

前端百題斬——js中的這些“this”指向都值得了解

開發 前端
this是javascript中的一個關鍵字,其使用方法類似于一個變量,是執行上下文中一個重要組成部分。其作用是可以在函數體內部獲取當前的運行環境。

[[403989]]

14.1 簡介

this是javascript中的一個關鍵字,其使用方法類似于一個變量,是執行上下文中一個重要組成部分。其作用是可以在函數體內部獲取當前的運行環境。

14.2 指向

每個函數的this是在調用的時候基于函數的執行環境綁定的,this的指向完全取決于函數的調用位置。(下面均是在瀏覽器環境下進行測試的結果)

在全局環境下,this 始終指向全局對象(window), 無論是否嚴格模式;

  1. console.log(this); // window 

普通函數內部的this分兩種情況,嚴格模式和非嚴格模式。

(1)非嚴格模式下,this 默認指向全局對象window

(2)嚴格模式下, this為undefined

  1. function fun() { 
  2.     console.log(this); // window 

對象內部方法的this指向調用這些方法的對象

(1)函數的定義位置不影響其this指向,this指向只和調用函數的對象有關;

(2)多層嵌套的對象,內部方法的this指向離被調用函數最近的對象(window也是對象,其內部對象調用方法的this指向內部對象, 而非window)。

  1. const obj = { 
  2.     a: 10, 
  3.     b: 20, 
  4.     addfunction () { 
  5.         return this.a + this.b; 
  6.     } 
  7. }; 
  8.  
  9. console.log(obj.add()); // 30 
  10. const add = obj.add
  11. console.log(add()); // NaN 

原型鏈中的方法的this仍然指向調用它的對象

  1. const obj = { 
  2.     a: 10, 
  3.     b: 20 
  4. }; 
  5.  
  6. const prototypeObj = { 
  7.     addfunction () { 
  8.         return this.a + this.b; 
  9.     } 
  10. }; 
  11.  
  12. Object.setPrototypeOf(obj, prototypeObj); 
  13.  
  14. console.log(obj.add()); // 30 

當函數通過Function對象的原型中繼承的方法 call() 和 apply() 方法調用時, 其函數內部的this值可綁定到 call() & apply() 方法指定的第一個對象上, 如果第一個參數不是對象,JavaScript內部會嘗試將其轉換成對象然后指向它。(見后續代碼)

通過bind方法綁定后, 函數將被永遠綁定在其第一個參數對象上, 而無論其在什么情況下被調用。(見后續代碼)

當函數被當做監聽事件處理函數時, 其 this 指向觸發該事件的元素(針對于addEventListener事件)

  1. <button id="testId">按鈕</button> 
  2.  
  3. const btn = document.getElementById('testId'); 
  4. btn.addEventListener('click'function() { 
  5.  console.log(this); // <button id="testId">按鈕</button> 
  6. }); 

內聯事件中的this指向分兩種情況:

(1)當代碼被內聯處理函數調用時,它的this指向監聽器所在的DOM元素

  1. <button onclick="console.log(this)">按鈕</button> // 輸出該DOM節點 

(2)當代碼被包括在函數內部執行時,其this指向等同于 函數直接調用的情況,即在非嚴格模式指向全局對象window, 在嚴格模式指向undefined

  1. <button onclick="clickFun()">按鈕</button> 
  2.  
  3. function clickFun() { 
  4.  console.log(this); // window 

對于延時函數內部的回調函數的this指向全局對象window(當然可以通過bind方法改變其內部函數的this指向)

  1. function Fun() { 
  2.     this.a = 10; 
  3.     this.method = function() { 
  4.         setTimeout(function() { 
  5.             console.log(this); // window 
  6.         }, 1000); 
  7.     } 
  8.  
  9. const fun = new Fun(); 
  10. fun.method(); 

由于箭頭函數不綁定this, 它會捕獲其所在(即定義的位置)上下文的this值, 作為自己的this值,所以 call() / apply() / bind() 方法對于箭頭函數來說只是傳入參數,對它的 this 毫無影響。

  1. function Fun() { 
  2.     this.a = 10; 
  3.     this.method = function() { 
  4.         setTimeout(() => { 
  5.             console.log(this); // Fun {a: 10, method: ƒ} 
  6.         }, 1000); 
  7.     } 
  8.  
  9. const fun = new Fun(); 
  10. fun.method(); 

14.3 改變this指向

除了隱式綁定this的方式,還能夠通過顯示綁定的方式,通過call、apply、bind方式改變this指向,對于這三者的區別后續將有專門的百題斬去闡述,本節主要進行一波簡單使用。

call()

call() 方法使用一個指定的 this 值和單獨給出的一個或多個參數來調用一個函數。

  1. function method(val1, val2) { 
  2.     return this.a + this.b + val1 + val2; 
  3.  
  4. const obj = { 
  5.     a: 1, 
  6.     b: 2 
  7. }; 
  8.  
  9. console.log(method.call(obj, 3, 4)); // 10 

apply()

apply() 方法調用一個具有給定this值的函數,以及以一個數組(或類數組對象)的形式提供的參數。

  1. function method(val1, val2) { 
  2.     return this.a + this.b + val1 + val2; 
  3.  
  4. const obj = { 
  5.     a: 1, 
  6.     b: 2 
  7. }; 
  8.  
  9. console.log(method.apply(obj, [3, 4])); // 10 

bind()

bind() 方法創建一個新的函數,在 bind() 被調用時,這個新函數的 this 被指定為 bind() 的第一個參數,而其余參數將作為新函數的參數,供調用時使用。

  1. function method(val1, val2) { 
  2.     return this.a + this.b + val1 + val2; 
  3.  
  4. const obj = { 
  5.     a: 1, 
  6.     b: 2 
  7. }; 
  8.  
  9. const bindMethod = method.bind(obj, 3, 4); 
  10. console.log(bindMethod); // [Function: bound method] 
  11. console.log(bindMethod()); // 10 

擴展

 

  • call() 和 apply()的區別是call()方法接受的是參數列表,而apply()方法接受的是一個參數數組;
  • bind返回的是一個綁定函數,而call和apply返回的是運行結果;
  • 多次 bind() 是無效的,只會綁定到第一次調用的對象上;
  • call() / apply() / bind() 方法對于箭頭函數來說只是傳入參數,對它的 this 毫無影響。

本文轉載自微信公眾號「執鳶者」,可以通過以下二維碼關注。轉載本文請聯系執鳶者公眾號。

 

責任編輯:武曉燕 來源: 執鳶者
相關推薦

2021-05-19 07:02:42

JS對象方法

2021-05-12 07:04:55

Js變量方式

2021-08-04 06:56:49

HTTP緩存前端

2021-07-14 07:00:53

瀏覽器技巧前端

2021-06-02 07:02:42

js作用域函數

2021-10-19 22:23:05

typeof方式Instanceof

2021-05-09 22:00:59

TypeofInstanceof運算符

2021-05-30 19:02:59

變量對象上下文

2021-06-09 07:01:30

前端CallApply

2014-08-19 14:12:47

Windows

2021-07-19 07:02:10

瀏覽器進程單進程瀏覽器

2021-11-19 09:01:09

防抖節流前端

2021-07-26 05:01:55

瀏覽器渲染流程

2021-10-18 09:01:01

前端賦值淺拷貝

2018-10-09 14:34:58

開源KubernetesGit

2021-06-11 06:54:34

原型構造函數

2021-07-05 07:02:33

前端跨域策略

2021-05-27 07:02:05

JavaScript代碼設施

2021-06-04 07:04:29

閉包JavaScript函數

2021-01-07 05:40:13

BLE模塊Android
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区三区四区av | 国产精品免费在线 | 亚洲一级淫片 | www.99热这里只有精品 | 精品亚洲一区二区三区四区五区高 | 欧美日本韩国一区二区 | 涩涩导航 | 国产精品1| 一二三区av | 国产成人精品久久 | 欧美亚洲激情 | 日韩在线不卡视频 | 日韩精品一区二区三区四区视频 | 91在线电影| 久草免费在线视频 | 亚洲欧洲一区 | 久久色视频 | 欧美在线高清 | 国产激情一区二区三区 | 日日干天天操 | 久久亚洲精品久久国产一区二区 | 欧美精品一区二区三区四区 | 成人av播放 | 免费在线视频a | 在线观看www | 91在线视频一区 | 在线中文视频 | 中文字幕在线视频精品 | 久久久久国产 | 高清欧美性猛交xxxx黑人猛交 | 亚洲国产精品一区在线观看 | 成人精品在线观看 | 日本精品免费在线观看 | 日韩在线成人 | 久草色视频| 91亚洲国产成人精品一区二三 | h视频免费在线观看 | 国产在线一区观看 | 国产精品久久久久久久午夜片 | 天天综合久久 | 成人欧美一区二区三区黑人孕妇 |