最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript This指向問題詳解

 更新時(shí)間:2019年11月25日 09:01:32   作者:Peerless1029  
這篇文章主要介紹了JavaScript This指向問題詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

這篇文章主要介紹了JavaScript This指向問題詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

各位小伙伴在面試中被面試官問道this指向問題一定不少吧,同時(shí)還被問道apply,call和bind的用法區(qū)別,現(xiàn)在,就來簡(jiǎn)單的聊一聊this到底指向何方。

1.基本概念

MDN的官方解釋:與其他語言相比,函數(shù)的 this 關(guān)鍵字在 JavaScript 中的表現(xiàn)略有不同,此外,在嚴(yán)格模式和非嚴(yán)格模式之間也會(huì)有一些差別。在絕大多數(shù)情況下,函數(shù)的調(diào)用方式?jīng)Q定了this的值。this不能在執(zhí)行期間被賦值,并且在每次函數(shù)被調(diào)用時(shí)this的值也可能會(huì)不同。

簡(jiǎn)而言之:

1.this指向的對(duì)象稱為函數(shù)的上下文對(duì)象context;  

2.this的指向取決于函數(shù)被調(diào)用方式

不管函數(shù)怎么調(diào)用的天花亂墜,我們只要記住這幾點(diǎn)即可清晰的找出this的指向。

2.小試牛刀

function foo(){
 console.log(this);
}

面試官問你this指向哪里,當(dāng)然大聲回答不知道,原因:誰調(diào)用指向誰,函數(shù)都沒被調(diào)用,確實(shí)不知道指向。

小結(jié):直接通過函數(shù)名來調(diào)用函數(shù),this指向全局變量window;通過對(duì)象.函數(shù)名調(diào)用函數(shù),this指向該對(duì)象。

3.DOM對(duì)象調(diào)用函數(shù)時(shí)this的指向問題

1.通過選擇器選擇元素加事件屬性來綁定事件,this指向該DOM對(duì)象,例子如下:

document.getElementById('btn').onclick=function(){
  console.log('click'); //click
  console.log(this); //<button id="btn">button</button>
 }

2.直接在DOM標(biāo)簽中寫事件,this指向window,我們可以通過吧this作為參數(shù)傳入方法中再使用,例子如下

html:
<button onclick="modify()">add</button>
<span id="count">0</span>
<button onclick="modify()">reduce</button>

script:
// 操作方法
 function modify(){
  console.log(this); //window
 }

因?yàn)檫@個(gè)時(shí)候是直接調(diào)用方法的,所以this指向全局window對(duì)象,那么問題來了,我們想判斷我們點(diǎn)擊的是哪一個(gè)按鈕,應(yīng)該怎么做呢,我們可以把this的值作為參數(shù)傳入方法中再使用,例子如下。

html:
<button onclick="modify(this)">add</button>
<span id="count">0</span>
<button onclick="modify(this)">reduce</button>

script:
// 操作方法
 function modify(_this){
  console.log(_this); 
// <button onclick="modify(this)">add</button>
// <button onclick="modify(this)">reduce</button>
 }

4.對(duì)象中this的指向問題

先看一個(gè)簡(jiǎn)單的例子:

var a=1;
function printA(){
 console.log(this.a);
}
var obj={
 a:2,
 foo:printA,
 bar:function(){
  printA();
 }
}
obj.foo(); //2
obj.bar(); //1var foo=obj.foo;foo(); //1

我們定義了一個(gè)全局變量a和一個(gè)打印a的全局變量方法,之后又定義了一個(gè)obj對(duì)象,其中包含a屬性和foo,bar兩個(gè)方法。當(dāng)我們調(diào)用obj.foo()打印了2,調(diào)用obj.bar()打印了1.

分析:

不管printA在哪里定義的,我們this的指向只取決于被誰調(diào)用的。在obj.foo(),foo的屬性值為printA,被obj直接調(diào)用,所以this指向obj,this.a就是obj.a=2了;

當(dāng)我們調(diào)用obj.bar()時(shí),bar的屬性值為function(){printA()},沒有明確哪個(gè)對(duì)象來調(diào)用printA方法,this默認(rèn)指向全局對(duì)象window,所以this.a=window.a=1;

第三種情況我們把obj.foo值賦予了foo變量,在調(diào)用的時(shí)候就相當(dāng)于是window.foo()了,打印1。

小結(jié):this的指向不是函數(shù)聲明是綁定的,而是在函數(shù)運(yùn)行過程中動(dòng)態(tài)綁定的。

5.改變this的指向方法:applay call bind

話不多話:寫了一個(gè)例子,大家先看,萬一比喻不恰當(dāng),大家能理解其中意思即可

var liLei={
 name:'liLei',
 money:10,
 buyPen:function(){
  this.money=this.money-1;
  console.log(this.name+" have money:"+this.money)
 }
}

var hanMeiMei={
 name:'hanMeiMei',
 money:20,
 buyPan:function(){
  this.money=this.money-2;
  console.log(this.name+" have money:"+this.money)
 }
}

liLei.buyPen(); // liLei have money:9
hanMeiMei.buyPan(); //hanMeiMei have money:18

例子很好理解,輸出的結(jié)果相信大家也能看得明白,哪天,韓梅梅想買一個(gè)盆,她買不了,因?yàn)樗€沒有這個(gè)方法,她一想:我沒有這個(gè)方法,但是李雷有啊,我打電話給李雷把錢他讓他幫我買?。缓髞砝罾紫胭I一個(gè)盤,實(shí)現(xiàn)方法也是如此。那么,在代碼中如何實(shí)現(xiàn)呢?

JavaScript有好幾個(gè)方法可以實(shí)現(xiàn):call,apply,bind。

call方法:

語法:call(thisObj,Object)

定義:調(diào)用一個(gè)對(duì)象的一個(gè)方法,以另一個(gè)對(duì)象替換當(dāng)前對(duì)象。

說明:

call 方法可以用來代替另一個(gè)對(duì)象調(diào)用一個(gè)方法。call 方法可將一個(gè)函數(shù)的對(duì)象上下文從初始的上下文改變?yōu)橛?thisObj 指定的新對(duì)象。如果沒有提供 thisObj 參數(shù),那么 Global 對(duì)象被用作 thisObj。

liLei.buyPen.call(hanMeiMei); //hanMeiMei have money:19
hanMeiMei.buyPan.call(liLei); //liLei have money:8

apply方法:

語法:apply(thisObj,[argArray])

定義:應(yīng)用某一對(duì)象的一個(gè)方法,用另一個(gè)對(duì)象替換當(dāng)前對(duì)象。

說明:

如果 argArray 不是一個(gè)有效的數(shù)組或者不是 arguments 對(duì)象,那么將導(dǎo)致一個(gè) TypeError。如果沒有提供 argArray 和 thisObj 任何一個(gè)參數(shù),那么 Global 對(duì)象將被用作 thisObj, 并且無法被傳遞任何參數(shù)。

liLei.buyPen.apply(hanMeiMei); //hanMeiMei have money:19
hanMeiMei.buyPan.apply(liLei); //liLei have money:8

bind方法:

liLei.buyPen.bind(hanMeiMei)(); //hanMeiMei have money:19
hanMeiMei.buyPan.apply(liLei)(); //liLei have money:8

小結(jié):三種方法的相同指出是:可以改變this的指向,不同之處是:apply接受的參數(shù)為一個(gè)數(shù)組,call接收的參數(shù)為一個(gè)個(gè)獨(dú)立的值;apply,call會(huì)直接調(diào)用方法,bind改變this的指向返回一個(gè)方法不調(diào)用。

注:有些低版本的瀏覽器不支持函數(shù)使用bind方法,我們?cè)谧鰹g覽器兼容時(shí)可以加以判斷,具體實(shí)現(xiàn)方法暫不贅述。

以上就是個(gè)人對(duì)于this的指向問題的理解,我們只需記住一點(diǎn):this指向-誰調(diào)用,指向誰。不得不說JavaScript真是個(gè)奇妙的世界,文中有紕漏不足的地方,歡迎指正。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • javascript天然的迭代器

    javascript天然的迭代器

    有一個(gè)數(shù)n=5,不用for循環(huán),怎么返回[1,2,3,4,5]這樣一個(gè)數(shù)組
    2010-10-10
  • 基于JavaScript實(shí)現(xiàn)的順序查找算法示例

    基于JavaScript實(shí)現(xiàn)的順序查找算法示例

    這篇文章主要介紹了基于JavaScript實(shí)現(xiàn)的順序查找算法,結(jié)合實(shí)例形式分析了javascript順序查找的原理、實(shí)現(xiàn)技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-04-04
  • JavaScript中的

    JavaScript中的"=、==、==="區(qū)別講解

    今天小編就為大家分享一篇關(guān)于JavaScript中的"=、==、==="區(qū)別講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • 微信小程序頁面返回傳值的4種解決方案匯總

    微信小程序頁面返回傳值的4種解決方案匯總

    這篇文章主要給大家介紹了關(guān)于微信小程序頁面返回傳值的4種解決方案,小程序開發(fā)中經(jīng)常會(huì)遇到這種場(chǎng)景,比如提交問題,然后需要返回之前頁面,本文通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-07-07
  • 總結(jié)兩個(gè)Javascript的哈稀對(duì)象的一些編程技巧

    總結(jié)兩個(gè)Javascript的哈稀對(duì)象的一些編程技巧

    總結(jié)兩個(gè)Javascript的哈稀對(duì)象的一些編程技巧...
    2007-04-04
  • js運(yùn)動(dòng)事件函數(shù)詳解

    js運(yùn)動(dòng)事件函數(shù)詳解

    這篇文章主要為大家詳細(xì)介紹了JavaScript運(yùn)動(dòng)事件函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • countUp.js實(shí)現(xiàn)數(shù)字滾動(dòng)效果

    countUp.js實(shí)現(xiàn)數(shù)字滾動(dòng)效果

    這篇文章主要為大家詳細(xì)介紹了countUp.js實(shí)現(xiàn)數(shù)字滾動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • js利用FileReader讀取本地文件或者blob方式

    js利用FileReader讀取本地文件或者blob方式

    這篇文章主要介紹了js利用FileReader讀取本地文件或者blob方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 函數(shù)式編程入門實(shí)踐(一)

    函數(shù)式編程入門實(shí)踐(一)

    這篇文章主要介紹了Javascript函數(shù)式編程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 詳解從0開始搭建微信小程序(前后端)的全過程

    詳解從0開始搭建微信小程序(前后端)的全過程

    這篇文章主要介紹了詳解從0開始搭建微信小程序(前后端)的全過程,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-04-04

最新評(píng)論

宜丰县| 珲春市| 吉林省| 敖汉旗| 青川县| 岑溪市| 六安市| 泗阳县| 通辽市| 乐都县| 乐昌市| 肇庆市| 漯河市| 定远县| 洛宁县| 西丰县| 峨眉山市| 大关县| 东阿县| 曲水县| 绍兴市| 上思县| 疏附县| 清流县| 牟定县| 鄂托克旗| 洛南县| 禹城市| 监利县| 册亨县| 武强县| 繁峙县| 宝坻区| 淮北市| 北安市| 五常市| 凤城市| 崇文区| 沈阳市| 新晃| 沈丘县|