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

JavaScript中的this原理及6種常見使用場景

開發 前端
this是JavaScript的一個關鍵字,函數調用時才會出現;因為函數是在一定的環境中運行的,調用函數時肯定需要知道是[誰調用的]?就用到了this進行指向;那么this到底指向的是什么?this 既不指向函數自身,也不指函數的詞法作用域,而是調用函數時的對象!

 一、this原理

this是JavaScript的一個關鍵字,函數調用時才會出現;

因為函數是在一定的環境中運行的,調用函數時肯定需要知道是[誰調用的]?就用到了this進行指向;

那么this到底指向的是什么?

this 既不指向函數自身,也不指函數的詞法作用域,而是調用函數時的對象!

[[314958]]

二、使用場景

(一)普通函數的調用,this指向的是Window

 

  1. var name = '卡卡'

  2. function cat(){ 
  3.     var name = '有魚'
  4.     console.log(this.name);//卡卡 
  5.     console.log(this);//Window {frames: Window, postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, …} 
  6. cat(); 

 

這里大家可能有疑問,不是說this指向的是調用函數的對象嗎?cat()并沒有對象出現啊,這個是因為在全局作用域中,window是根目錄,一般可以省略,例如:alert()其實是 window.alert();

(二)對象的方法,this指的是該對象

1、一層作用域鏈時,this指的該對象

 

  1. var name = '卡卡'
  2. var cat = { 
  3.     name:'有魚'
  4.     eat:function(){ 
  5.         console.log(this.name);//有魚 
  6.     } 
  7. cat.eat(); 

 

因為函數eat是由cat對象調用的,所以this指向的是cat本身,所以cat.name=有魚;

2、多層作用域鏈時,this指的是距離方法最近的一層對象

 

  1. var name = '卡卡'
  2. var cat = { 
  3.     name:'有魚'
  4.     eat1:{ 
  5.         name:'年年'
  6.         eat2:function(){ 
  7.             console.log(this.name);//年年 
  8.         } 
  9.     } 
  10. cat.eat1.eat2(); 

 

eat2方法包含在兩個對象cat、eat1中,但是緊挨著的eat1對象,所以this.name指的是eat1的屬性name,即[年年]

這里需要注意一個情況,如果cat.eat1.eat2這個結果賦值給一個變量eat3,則eat3()的值是多少呢?

 

  1. var eat3 = cat.eat1.eat2; 
  2. eat3(); // 卡卡 

 

答案是[卡卡],這個是因為經過賦值操作時,并未發起函數調用,eat3()這個才是真正的調用,而發起這個調用的是根對象window,所以this指的就是window,this.name=卡卡

 

(三)構造函數的調用,this指的是實例化的新對象

 

  1. var name = '卡卡'
  2. function Cat(){ 
  3.     this.name = '有魚'
  4.     this.type = '英短藍貓'
  5. var cat1 = new Cat(); 
  6. console.log(cat1);// 實例化新對象 Cat {name"有魚", type: "英短藍貓"
  7. console.log(cat1.name);// 有魚 

 

(四)apply和call調用時,this指向參數中的對象

 

  1. var name = '有魚'
  2. function eat(){ 
  3.     console.log(this.name); 
  4. var cat = { 
  5.     name:'年年'
  6. var dog = { 
  7.     name:'高飛'
  8.  
  9. eat.call(cat);// 年年 
  10. eat.call(dog);// 高飛 

 

apply方法和call方法相當于改變了顯式的修改了prototype原型

 

(五)匿名函數調用,指向的是全局對象

 

  1. var name = '卡卡'
  2. var cat = { 
  3.     name:'有魚'
  4.     eat:(function(){ 
  5.         console.log(this.name);//卡卡 
  6.     })() 
  7. cat.eat; 

 

這里提一下匿名函數調用方式,常用的有三種方法:

 

  1. //①先用()包起來,然后再后面跟 (參數)  
  2. (function(data){ 
  3.     console.log(data); 
  4. })("222"); 
  5.  
  6. //②先后面跟(參數),然后再()包起來 
  7. (function(data){ 
  8.     console.log(data); 
  9. }("333")); 
  10.  
  11. //③正常函數格式,前面加 ! 
  12. !function(data){ 
  13.     console.log(data); 
  14. }("444"); 

 

(六)定時器中調用,指向的是全局變量

常用的定時器有setInterval和setTimeout,拿setInterval舉例子:

 

  1. var name = '卡卡'
  2. var cat = setInterval(function(){ 
  3.     var name = '有魚'
  4.     console.log(this.name);// 卡卡 
  5.     clearInterval(cat); 
  6. },500); 

 

其實定時器的本質,也是一種匿名函數的形式。

總結:

①普通函數的調用,this指向的是window

②對象方法的調用,this指的是該對象,且是最近的對象

③構造函數的調用,this指的是實例化的新對象

④apply和call調用,this指向參數中的對象

⑤匿名函數的調用,this指向的是全局對象window

⑥定時器中的調用,this指向的是全局變量window

責任編輯:華軒 來源: segmentfault
相關推薦

2023-04-28 15:05:25

React軟件項目可維護性

2023-03-01 15:39:50

JavaScrip對象屬性ES6

2023-05-28 23:49:38

JavaScrip開發

2021-08-13 12:31:26

Redis代碼Java

2025-04-24 10:40:46

CatalogFlink SQL元數據

2022-07-29 07:48:15

HTTP常用狀態碼

2018-05-22 09:47:07

2021-09-18 10:20:07

Redis數據庫緩存

2018-05-11 09:07:39

Docker存儲驅動

2024-11-27 08:15:50

2020-09-04 13:30:43

Java自定義代碼

2025-02-10 08:30:00

JavaScrip開發設計模式

2023-05-16 07:47:18

RabbitMQ消息隊列系統

2024-12-30 08:29:05

2020-07-28 17:51:36

RiffKubernetes無服務器

2020-10-29 07:16:26

布隆過濾器場景

2022-05-06 13:30:56

TDD場景代碼

2018-12-03 12:20:52

Systemd定時器Linux

2024-01-30 09:43:43

Java緩存技術

2024-04-16 12:13:07

usingC#開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日本天堂视频在线观看 | 国产三级日本三级 | 天天干夜夜操视频 | 在线免费黄色小视频 | 国产视频久久 | 亚洲精品1区2区3区 91免费看片 | 国产美女自拍视频 | 国产精品久久久爽爽爽麻豆色哟哟 | 久久成人精品视频 | 亚洲精品一区中文字幕乱码 | 华丽的挑战在线观看 | 99国产精品99久久久久久 | 天天草天天 | 亚洲三区视频 | 成人午夜在线 | 久久久久久久91 | 成人在线一区二区三区 | 一级欧美一级日韩片免费观看 | 久久久九九 | 天天干夜夜操 | 欧美在线视频二区 | 精品美女在线观看视频在线观看 | 91国在线高清视频 | 一区二区三区四区五区在线视频 | 久久久婷 | 久久99精品国产自在现线小黄鸭 | 在线看av的网址 | 美女131mm久久爽爽免费 | 欧美中文一区 | 亚洲成人久久久 | 日韩成人免费视频 | 久久久久久国产精品免费免费 | 国产成人精品999在线观看 | 九九热在线观看视频 | 久久久www成人免费精品张筱雨 | 色就是色欧美 | 欧美日韩在线免费观看 | 中文字幕乱码一区二区三区 | 一区二区三区四区五区在线视频 | 精品国产一区二区三区免费 | 欧美成人免费在线 |