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

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

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

 一、this原理

this是JavaScript的一個關鍵字,函數(shù)調用時才會出現(xiàn);

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

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

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

[[314958]]

二、使用場景

(一)普通函數(shù)的調用,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指向的是調用函數(shù)的對象嗎?cat()并沒有對象出現(xiàn)啊,這個是因為在全局作用域中,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(); 

 

因為函數(shù)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(); // 卡卡 

 

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

 

(三)構造函數(shù)的調用,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指向參數(shù)中的對象

 

  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原型

 

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

 

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

 

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

 

  1. //①先用()包起來,然后再后面跟 (參數(shù))  
  2. (function(data){ 
  3.     console.log(data); 
  4. })("222"); 
  5.  
  6. //②先后面跟(參數(shù)),然后再()包起來 
  7. (function(data){ 
  8.     console.log(data); 
  9. }("333")); 
  10.  
  11. //③正常函數(shù)格式,前面加 ! 
  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); 

 

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

總結:

①普通函數(shù)的調用,this指向的是window

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

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

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

⑤匿名函數(shù)的調用,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開發(fā)

2021-08-13 12:31:26

Redis代碼Java

2022-07-29 07:48:15

HTTP常用狀態(tài)碼

2025-04-24 10:40:46

CatalogFlink SQL元數(shù)據(jù)

2018-05-22 09:47:07

2021-09-18 10:20:07

Redis數(shù)據(jù)庫緩存

2024-11-27 08:15:50

2018-05-11 09:07:39

Docker存儲驅動

2020-09-04 13:30:43

Java自定義代碼

2023-05-16 07:47:18

RabbitMQ消息隊列系統(tǒng)

2025-02-10 08:30:00

JavaScrip開發(fā)設計模式

2024-12-30 08:29:05

2020-07-28 17:51:36

RiffKubernetes無服務器

2024-04-16 12:13:07

usingC#開發(fā)

2024-01-30 09:43:43

Java緩存技術

2024-12-19 08:50:38

Redis存儲系統(tǒng)

2015-04-07 10:46:48

Redis

2020-10-29 07:16:26

布隆過濾器場景
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99re在线 | 成人做爰69片免费观看 | 免费在线观看黄色av | 亚洲国产aⅴ成人精品无吗 亚洲精品久久久一区二区三区 | 视频一区二区三区在线观看 | 亚州一区二区三区 | 国产精品伦一区二区三级视频 | 欧美成人一区二区 | 在线只有精品 | 国产黄色电影 | 久精品久久 | 国产视频1区2区 | 国产91久久精品一区二区 | 欧美区日韩区 | 在线免费毛片 | 中文字幕欧美一区 | 日日噜噜夜夜爽爽狠狠 | 欧美在线一区二区三区 | 精品国产欧美 | 午夜视频在线免费观看 | 欧美一区不卡 | 精品国产成人 | 欧美日韩中文字幕在线 | 亚洲一区二区三区免费 | 国产成人一区在线 | 亚洲精选久久 | 国产视频一区二区在线观看 | 欧美激情一区 | 久久久精品视频免费看 | 青娱乐av | 黄色片在线看 | 一级a爱片久久毛片 | 在线观看成人免费视频 | 色欧美片视频在线观看 | 久久久久国 | 日韩免费一区二区 | 国产精品毛片av一区 | 国产一区h | www视频在线观看 | 亚洲人va欧美va人人爽 | 人妖videosex高潮另类 |