400-650-7353
您所在的位置:首頁 > IT干貨資料 > web前端 > 【Web前端基礎知識】this詳解

【Web前端基礎知識】this詳解

  • 發布: Web前端培訓
  • 來源:Web前端干貨資料
  • 2021-01-08 16:12:22
  • 閱讀()
  • 分享
  • 手機端入口

今天,我們學習一下JavaScript中的this。我們從什么是this,ES5及ES6中this的幾種情況進行學習。讓this變的so easy,我們這里說的都是非嚴格模式下。

什么是this

this表示當前行為執行的主體,在javaScript中this不是函數獨有的,但是我們主要研究的是函數中的this,為了方便大家理解我們舉個例子。

小明今天項目成功上線了,提前下班,不用加班了,獎勵自己去肯德基吃一個漢堡,對于這句話我們簡單的分析下:

在哪里吃:肯德基

誰吃:小明

在這里肯德基是吃的環境,小明是當前吃這個行為的主體。

ES5中this的幾種情況

1.全局作用域下的this是window

前邊的我們說過this代表當前行為執行的主體,在全局作用域下所有的屬性和方法都是window的屬性和方法,并且window是可以省略的。那么也就是說我們去調用一個方法在全局作用域下,誰調用的也就是window調用,那么window就是當前行為執行的主體,和去肯德基吃漢堡是一樣的誰吃小明,那么小明就是當前行為執行的主體。

  1. //全局作用域下 
  2. Var myBody = document.body; 
  3. //window是可以省略的  當前body元素的寬度都會被輸出 
  4. console.log(window.getComputedStyle(myBody).width;);//726px 
  5. console.log(getComputedStyle(myBody).width;);//726px 
  6. //我們在這里輸出this  ->window 
  7. console.log(this);//window   

2.自執行函數中的this是window

在javaScript中我們主要研究的是函數中的this,自執行函數中的this永遠是window,因為函數就是一個方法,一種行為,這個行為是直接執行的,那么執行的主體就是window。

  1. //這里我們寫兩個自執行函數 
  2. ~function(){ 
  3. console.log(this);  //->window 
  4. }(); 
  5.  
  6. (function (){ 
  7. console.log(this);//->window 
  8. })(); 

3.當前函數執行就看前面有沒有點(.),點前面是誰this就是誰,和當前函數在哪里定義的及在哪里執行的沒有關系,沒有點就是window.

還是一樣的道理,.前面就表示當前行為執行的主體。如果沒有依然當前行為執行的主體是window.

  1. //定義一個函數 
  2. function hello(){ 
  3. console.log(this); 
  4. hello();//this->window 
  5. //定義一個對象設置屬性為hello值是對應的那個函數 
  6. Var obj = {hello:hello}; 
  7. //我們再去調用的時候  發現是obj這個對象調用的這個函數  那么obj就是當前行為執行的主體  和這個函數在哪里定義是沒有關系的。 
  8. Obj.hello(); //this->obj 

4.call,apply,bind改變this指向問題就看方法中的第一個參數是誰this就是誰。

首先call,apply,bind這三個方法都是用來改變this的指向,其實本質就是改變當前行為執行的主體。由于這個三個方法第一個參數傳遞都是當前行為執行的主體。所以就看第一個參數即可。

  1. //定義一個函數 
  2. function world(){ 
  3.    console.log(this); 
  4. //定義一個對象 
  5. Var obj = {name:”哈哈”}; 
  6. //將obj變為這個方法行為執行的主體 
  7. World.call(obj);//this->obj 
  8. //apply和bind同理只是傳遞參數和使用方式略有不同 

ES6中this的幾種情況

1.箭頭函數是沒有自己this的,this是繼承它的宿主環境(上級作用域) 宿主環境不是執行的環境,而是定義的環境。

  1. let fn = () => { 
  2.     console.log(this); 
  3.  
  4. fn();//this->window 
  5.  let obj = { 
  6.   name: "obj", 
  7.   sum: function () { 
  8.    fn(); //在widnow下定義的,所以它的宿主環境是widnow而不是sum 
  9.    } 
  10.  }; 

2. ES6類構造器中的this是當前這個實例,而原型上的函數中的this指向調用者。

  1. //類中的this 
  2.         class Btn { 
  3.             constructor(tagName) { 
  4.                 this.btn = document.querySelector(id); 
  5.                 thisthis.btn.onclick = this.click; 
  6.                 console.log(this); //this->這個類的實例 
  7.             } 
  8.             click() { 
  9.                 // 方法里的this指向調用者 
  10.                 console.log(this); //this->btn這個元素 
  11.             } 
  12.         } 
  13.         var btn = new Btn('input'); 
  14.      

 

文章“【Web前端基礎知識】this詳解”已幫助

>>本文地址:http://www.028benet.com/zhuanye/2021/64813.html

THE END  

聲明:本站稿件版權均屬中公教育優就業所有,未經許可不得擅自轉載。

1 您的年齡

2 您的學歷

3 您更想做哪個方向的工作?

獲取測試結果
  • 大前端大前端
  • 大數據大數據
  • 互聯網營銷互聯網營銷
  • JavaJava
  • Linux云計算Linux
  • Python+人工智能Python
  • 嵌入式物聯網嵌入式
  • 全域電商運營全域電商運營
  • 軟件測試軟件測試
  • 室內設計室內設計
  • 平面設計平面設計
  • 電商設計電商設計
  • 網頁設計網頁設計
  • 全鏈路UI/UE設計UI設計
  • VR/AR游戲開發VR/AR
  • 網絡安全網絡安全
  • 新媒體與短視頻運營新媒體
  • 直播帶貨直播帶貨
  • 智能機器人軟件開發智能機器人
 

快速通道fast track

近期開班時間TIME

主站蜘蛛池模板: 第四色亚洲色图| 亚洲av无码不卡久久| 久久婷婷五月综合国产尤物app| 两个人看的www日本动漫| 91亚洲导航深夜福利| 色噜噜狠狠色综合欧洲selulu| 永久黄网站色视频免费| 日本免费高清一本视频| 处女的诱惑在线观看| 再深点灬舒服灬太大| 久久天堂成人影院| 大肚子孕妇交xxxgif| 国语自产精品视频在线区| 国产免费一区二区三区免费视频 | 免费观看国产网址你懂的| 男女疯狂一边摸一边做羞羞视频| 日韩视频免费观看| 在线jyzzjyzz免费视频| 哒哒哒免费视频观看在线www| 亚洲一区二区三区无码中文字幕 | 热久久这里是精品6免费观看| 精品韩国亚洲av无码不卡区| 最近中文字幕国语免费完整| 在线综合 亚洲 欧美中文字幕 | 亚洲av无码乱码在线观看| a级毛片免费播放| 老子影院午夜精品无码| 最近中文字幕电影大全免费版| 国模视频一区二区| 午夜福利一区二区三区在线观看 | 正能量网站不用下载免费观看视频软件| 精品人妻系列无码人妻免费视频 | 很黄很色的女同性互慰小说| 国产欧美另类久久精品蜜芽| 亚洲色大成网站www永久男同| 丰满上司的美乳| 黑人巨大人精品欧美三区| 欧美日韩国产另类一区二区三区 | 国产精品久久久久久福利| 伊人婷婷综合缴情亚洲五月 | 人人妻人人澡人人爽超污 |