欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript 中的 this 簡單規(guī)則

 更新時間:2017年09月19日 10:07:55   投稿:mrr  
想要確定this里規(guī)則是什么,其實方法很簡單,通過檢查它的調(diào)用位置,在函數(shù)被調(diào)用的時候確定this,下面就跟隨腳本之家小編一起通過本文學習吧

幾條規(guī)則確定函數(shù)里的 this 是什么。

想確定 this 是什么其實非常簡單。總體的規(guī)則是,通過檢查它的調(diào)用位置,在函數(shù)被調(diào)用的的時候確定 this。它遵循下面這些規(guī)則,接下來以優(yōu)先級順序說明。

規(guī)則

1、如果在調(diào)用函數(shù)時使用 new 關鍵字,那么函數(shù)里的 this 就是一個全新的對象。

function ConstructorExample() {
  console.log(this);
  this.value = 10;
  console.log(this);
}
new ConstructorExample();
// -> {}
// -> { value: 10 }

2、如果使用 apply、call 或者 bind 調(diào)用函數(shù),那么函數(shù)里的 this 就是作為參數(shù)傳進去的對象。

function fn() {
  console.log(this);
}
var obj = {
  value: 5
};
var boundFn = fn.bind(obj);
boundFn();   // -> { value: 5 }
fn.call(obj); // -> { value: 5 }
fn.apply(obj); // -> { value: 5 }

3、如果函數(shù)作為一個方法調(diào)用,就是說如果使用點符號調(diào)用函數(shù),那么 this 就是擁有這個函數(shù)作為屬性的對象。換句話說,當一個點在函數(shù)調(diào)用的左側時,this 就是這個點左側的那個對象。

var obj = {
  value: 5,
  printThis: function() {
    console.log(this);
  }
};
obj.printThis(); // -> { value: 5, printThis: ƒ }

4、如果函數(shù)作為一個純粹的函數(shù)調(diào)用,也就是說,它在沒有上述任何條件的情況下被調(diào)用,那么 this 就是全局對象。在瀏覽器里,就是 window 對象。

function fn() {
  console.log(this);
}
// 如果在瀏覽器里調(diào)用:
fn(); // -> Window {stop: ƒ, open: ƒ, alert: ƒ, ...}

注意這個規(guī)則其實和第三個規(guī)則是一樣的,區(qū)別在于沒有聲明為方法的函數(shù)會自動成為全局對象 window 的屬性。因此,這其實是一個隱式的方法調(diào)用。當我們調(diào)用 fn(),其實就會被瀏覽器理解為 window.fn(),所以 this 就是 window。

console.log(fn === window.fn); // -> true

5、如果上述規(guī)則有多個適用,那么優(yōu)先級更高的就會設置 this 值。

6、如果是 ES2015 里的箭頭函數(shù),那么它將忽略上述所有規(guī)則,并在創(chuàng)建的時候接收包含它的作用域作為 this 的值。想確定 this 具體是什么的話,只需從創(chuàng)建箭頭函數(shù)那里往上一行,看看那兒的 this 是什么,箭頭函數(shù)里的 this 值和它一樣。

const obj = {
  value: 'abc',
  createArrowFn: function() {
    return () => console.log(this);
  }
};
const arrowFn = obj.createArrowFn();
arrowFn(); // -> { value: 'abc', createArrowFn: ƒ }

看回第三個規(guī)則,當我們調(diào)用 obj.createArrowFn() 的時候,createArrowFn 里的 this 是 obj,因為這是方法調(diào)用。因此,obj 會在 arrowFn 里綁定到 this 上。如果我們在全局作用域創(chuàng)建一個箭頭函數(shù),那么 this 值就會是 window。

應用規(guī)則

讓我們來看一個代碼示例,并應用這些規(guī)則。嘗試一下看能否弄清楚不同的函數(shù)調(diào)用下,this 是什么。

確定應用了哪條規(guī)則

var obj = {
  value: 'hi',
  printThis: function() {
    console.log(this);
  }
};
var print = obj.printThis;
obj.printThis(); // -> {value: "hi", printThis: ƒ}
print(); // -> Window {stop: ƒ, open: ƒ, alert: ƒ, ...}

obj.printThis() 屬于第三條規(guī)則,方法調(diào)用。另一方面,print() 屬于第四條規(guī)則,純粹的函數(shù)調(diào)用。對于 print() 來說,我們在調(diào)用的時候沒有使用 new、bind/call/apply 或者點符號,所以它對應了規(guī)則四,this 就是全局對象 window。

當適用多個規(guī)則的時候

當適用多個規(guī)則的時候,使用列表里更高優(yōu)先級的規(guī)則。

var obj1 = {
  value: 'hi',
  print: function() {
    console.log(this);
  },
};
var obj2 = { value: 17 };

如果規(guī)則二和規(guī)則三同時適用,那么規(guī)則二占優(yōu)。

obj1.print.call(obj2); // -> { value: 17 }

如果規(guī)則一和規(guī)則三同時適用,那么規(guī)則一占優(yōu)。

new obj1.print(); // -> {}

有些庫有時候會故意將 this 值綁定到某些函數(shù)里。而通常會在函數(shù)里將最有用的值綁定到 this 上使用。舉個例子,jQuery 把 this 綁定到 DOM 元素上,在回調(diào)中觸發(fā)一個事件。如果某個庫出現(xiàn)一個不太符合上述規(guī)則的 this 值,那么請仔細閱讀這個庫的文檔,它很有可能使用 bind 綁定了。

總結

以上所述是小編給大家介紹的JavaScript 中的 this 簡單規(guī)則,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關文章

  • js+css實現(xiàn)select的美化效果

    js+css實現(xiàn)select的美化效果

    這篇文章主要為大家詳細介紹了js+css實現(xiàn)select的美化效果,如何針對select進行美化,感興趣的小伙伴們可以參考一下
    2016-03-03
  • 微信小程序websocket實現(xiàn)即時聊天功能

    微信小程序websocket實現(xiàn)即時聊天功能

    這篇文章主要為大家詳細介紹了微信小程序websocket實現(xiàn)即時聊天功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • JavaScript兩種axios取消請求方式小結

    JavaScript兩種axios取消請求方式小結

    本文主要介紹了JavaScript兩種axios取消請求方式小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • JS實現(xiàn)隨機亂撞彩色圓球特效的方法

    JS實現(xiàn)隨機亂撞彩色圓球特效的方法

    這篇文章主要介紹了JS實現(xiàn)隨機亂撞彩色圓球特效的方法,可實現(xiàn)彩色小球的碰撞效果,涉及隨機函數(shù)與頁面樣式的操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-05-05
  • javascript jscroll模擬html元素滾動條

    javascript jscroll模擬html元素滾動條

    這里是自己在工作不太忙的時候?qū)懗鰜砹艘粋€用戶可以自定義的滾動條jscroll,以下簡稱jscroll。jscroll默認只提供一種滾動條樣式,部分樣式來自google webstore ,其中有部分css3樣式主要用于實現(xiàn)圓角,陰影效果
    2012-12-12
  • js判斷對象是否是某一類型

    js判斷對象是否是某一類型

    下面的代碼就是判斷腳本之家是不是字符串類型的代碼
    2008-11-11
  • 微信小程序開發(fā)之tabbar圖標和顏色的實現(xiàn)

    微信小程序開發(fā)之tabbar圖標和顏色的實現(xiàn)

    這篇文章主要介紹了微信小程序開發(fā)之tabbar圖標和顏色的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • layui使用技巧和常見問題匯總

    layui使用技巧和常見問題匯總

    layui技巧:下拉框未展示問題;下拉框的onchange事件處理;關閉彈出層,重新加載父頁面;父頁面如何傳遞參數(shù)給彈出層的iframe頁面;表單元素處于禁用狀態(tài);表單提交如何獲取表單元素值集合;數(shù)據(jù)表格固定列;帶搜索的下拉框;表單提交阻止頁面跳轉(zhuǎn);父頁面和子窗口傳遞值
    2024-07-07
  • Javascript 訪問樣式表實現(xiàn)代碼

    Javascript 訪問樣式表實現(xiàn)代碼

    Javascript訪問樣式表--又一篇好文章
    2009-08-08
  • Javascript 陷阱 window全局對象

    Javascript 陷阱 window全局對象

    ff和ie6下都是同樣的運行結果,看來不是bug,那究竟是為什么呢? 注意到:對象方法訪問其對象的屬性時|必須|加以this.(和java不一樣).
    2008-11-11

最新評論