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

淺談js中的this問(wèn)題

 更新時(shí)間:2017年08月31日 08:17:00   作者:快樂(lè)的~小和尚  
下面小編就為大家?guī)?lái)一篇淺談js中的this問(wèn)題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

this

this的指向在函數(shù)定義的時(shí)候是確定不了的,只有函數(shù)執(zhí)行的時(shí)候才能確定this到底指向誰(shuí),實(shí)際上

this的最終指向的是那個(gè)調(diào)用它的對(duì)象(這里其實(shí)并不完全對(duì),this的指向有時(shí)候會(huì)很微妙,得靠自己去慢慢體會(huì))

只有方法在對(duì)象上,對(duì)象調(diào)用當(dāng)前方法,指向當(dāng)前對(duì)象

function fnThis(){
 let user='js';
 console.log(this.user)//undefined
 console.log(this)//global(window)
}

fnThis();

這里為什么會(huì)輸出一個(gè)全局的對(duì)象?因?yàn)槲覀兩昝鞯暮瘮?shù),在全局里,現(xiàn)在執(zhí)行這個(gè)函數(shù)

實(shí)際上是全局在調(diào)用

let obj={
 user:'js',
 fn:function(){
 console.log(this.user)
 }
obj.fn();

這里是obj在調(diào)用,所以指向我們的obj,這并不能說(shuō)明,我們一開始就說(shuō)的this最終調(diào)用他的那個(gè)

對(duì)象

let obj={
 user:'js',
 objTwo:{
 user:'css',
 fn:function(){
  console.log(this.user)
 }
 }
}

obj.objTwo.fn();

這里只是指向了obj2,而并沒有指向最終調(diào)用它的obj.

來(lái)個(gè)料咋們看看this這家伙

<button id="myBtn" value="按鈕">按鈕</button>
<script>

let myBtn=document.querySelector("#myBtn")
let fn=function(){
  console.log(this);
}
myBtn.onclick=function(){
  fn();//輸出的全局
  console.log(this);//輸出的是這個(gè)button
}
</script>

這里從表面看,會(huì)認(rèn)為第一個(gè)輸出的是這個(gè)btn按鈕,不是說(shuō)誰(shuí)調(diào)用指向誰(shuí)么,但是咋們仔細(xì)看這個(gè)是btn在調(diào)用么???

其實(shí)是這個(gè)點(diǎn)擊事件的匿名函數(shù)在調(diào)用,而這fn()本身是全局上下文的函數(shù),它的this指向的是全局,它是作為這個(gè)匿名函數(shù)的普通函數(shù),自然指向的全局

我們?nèi)绻@樣寫

myBtn.onclick=fn;//btn點(diǎn)擊的時(shí)候就指向這個(gè)btn了,這時(shí)候輸出結(jié)果為這個(gè)button,

總結(jié)

1. 全局上下文,或者普通函數(shù)上下文里面的this,包括函數(shù)里面的普通函數(shù),都是指向全局
2. 在對(duì)象方法里面的this指向該對(duì)象
3. 在事件方法里面的this指向發(fā)生事件的這個(gè)對(duì)象

特殊情況

let obj={
 user:'js',
 objTwo:{
 user:'css',
 fn:function(){
  console.log(this.user)
  console.log(this)
 }
 }
}

let objThre=obj.objTwo.fn;

objThree();

把函數(shù)賦值給了objThree,而objThree是在全局上,所以輸出的是全局

補(bǔ)充

let chinesePeople=function(){
 this.name='張飛';
 return obj
 }

如果返回的是對(duì)象,this就指向返回的那個(gè)對(duì)象,否則就指向?qū)嵗龑?duì)象

改變的幾種方式

let obj={a:80}
let objTwo={
 a:70,
 fn:function(){
  console.log(this.a);
 }
}

objTwo.fn.call(obj);
調(diào)用一個(gè)方法,并改變其this指向

objTwo.fn.apply(obj);
調(diào)用一個(gè)方法,并改變其this指向

前2者區(qū)別,在于后面的參數(shù),一個(gè)是順序,一個(gè)是數(shù)組

objTwo.fn.bind(obj)();

bind()方法會(huì)創(chuàng)建一個(gè)新函數(shù),在綁定后,我們可以加括號(hào)立即執(zhí)行,也可以等需要執(zhí)行再執(zhí)行

第一個(gè)參數(shù)對(duì)象,以后的順序傳參

new方法,其實(shí)是隱藏的調(diào)用了一個(gè)call的方法

以上這篇淺談js中的this問(wèn)題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

陇川县| 郓城县| 河池市| 陆河县| 邹平县| 叶城县| 咸宁市| 黑水县| 明光市| 安庆市| 星子县| 聂荣县| 灵武市| 离岛区| 武安市| 隆子县| 双城市| 绩溪县| 达拉特旗| 南陵县| 科技| 德惠市| 棋牌| 高州市| 徐闻县| 黑河市| 宁晋县| 普安县| 万载县| 庆安县| 建水县| 江西省| 建瓯市| 江孜县| 新巴尔虎左旗| 昌乐县| 交城县| 玉树县| 大安市| 新竹市| 章丘市|