日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JavaScript中this详解

發布時間:2025/3/20 javascript 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaScript中this详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

摘要:JavaScript中的this總是讓人迷惑,應該是js眾所周知的坑之一。 個人也覺得js中的this不是一個好的設計,由于this晚綁定的特性,它可以是全局對象,當前對象,或者…有人甚至因為坑大而不用this。

?

其實如果完全掌握了this的工作原理,自然就不會走進這些坑。來看下以下這些情況中的this分別會指向什么:

1.全局代碼中的this

  • alert(x);//?全局變量x值為2??
  • ?

    全局范圍內的this將會指向全局對象,在瀏覽器中即使window。

    2.作為單純的函數調用

    ?

  • function?fooCoder(x)?{??
  • this.x?=?x;??
  • }??
  • fooCoder(2);??
  • alert(x);//?全局變量x值為2??
  • ?

    這里this指向了全局對象,即window。在嚴格模式中,則是undefined。

    3.作為對象的方法調用

  • var?name?=?"clever?coder";??
  • var?person?=?{??
  • name?:?"foocoder",??
  • hello?:?function(sth){??
  • console.log(this.name?+?"?says?"?+?sth);??
  • }??
  • }??
  • person.hello("hello?world");??
  • ?

    輸出 foocoder says hello world。this指向person對象,即當前對象。

    4.作為構造函數

  • new?FooCoder();??
  • 函數內部的this指向新創建的對象。

    ?

    5.內部函數

  • var?name?=?"clever?coder";??
  • ??
  • var?person?=?{??
  • name?:?"foocoder",??
  • hello?:?function(sth){??
  • var?sayhello?=?function(sth)?{??
  • console.log(this.name?+?"?says?"?+?sth);??
  • };??
  • sayhello(??
  • }??
  • ??
  • person.hello("hello?world");//clever?coder?says?hello?world??
  • ?

    在內部函數中,this沒有按預想的綁定到外層函數對象上,而是綁定到了全局對象。這里普遍被認為是JavaScript語言的設計錯誤,因為沒有人想讓內部函數中的this指向全局對象。一般的處理方式是將this作為變量保存下來,一般約定為that或者self:

  • var?name?=?"clever?coder";??
  • var?person?=?{??
  • name?:?"foocoder",??
  • hello?:?function(sth){??
  • var?that?=?this;??
  • var?sayhello?=?function(sth)?{??
  • console.log(that.name?+?"?says?"?+?sth);??
  • };??
  • sayhello(sth);??
  • }??
  • }??
  • person.hello("hello?world");//foocoder?says?hello?world??
  • ?

    6.使用call和apply設置this

  • person.hello.call(person,?"world");??
  • apply和call類似,只是后面的參數是通過一個數組傳入,而不是分開傳入。兩者的方法定義:
  • call(?thisArg?[,arg1,arg2,…?]?);??//?參數列表,arg1,arg2,...??
  • ??
  • apply(thisArg?[,argArray]?);?????//?參數數組,argArray??
  • ?

    兩者都是將某個函數綁定到某個具體對象上使用,自然此時的this會被顯式的設置為第一個參數。

    簡單地總結

    簡單地總結以上幾點,可以發現,其實只有第六點是讓人疑惑的。

    其實就可以總結為以下幾點:

    ?

  • 當函數作為對象的方法調用時,this指向該對象。
  • 當函數作為淡出函數調用時,this指向全局對象(嚴格模式時,為undefined)
  • 構造函數中的this指向新創建的對象
  • 嵌套函數中的this不會繼承上層函數的this,如果需要,可以用一個變量保存上層函數的this。
  • ?

    再總結的簡單點,如果在函數中使用了this,只有在該函數直接被某對象調用時,該this才指向該對象。

  • obj.foocoder();??
  • foocoder.call(obj,?...);??
  • foocoder.apply(obj,?…);??
  • ?

    更進一步

    我們可能經常會寫這樣的代碼:

  • $("#some-ele").click?=?obj.handler;??
  • 如果在handler中用了this,this會綁定在obj上么?顯然不是,賦值以后,函數是在回調中執行的,this會綁定到$(“#some-div”)元素上。這就需要理解函數的執行環境。本文不打算長篇贅述函數的執行環境,可以參考《javascript高級程序設計》中對執行環境和作用域鏈的相關介紹。這里要指出的時,理解js函數的執行環境,會更好地理解this。

    ?

    那我們如何能解決回調函數綁定的問題?ES5中引入了一個新的方法,bind():

  • fun.bind(thisArg[,?arg1[,?arg2[,?...]]])??
  • ??
  • thisArg??
  • ?

    當綁定函數被調用時,該參數會作為原函數運行時的this指向.當使用new 操作符調用綁定函數時,該參數無效.

  • arg1,?arg2,?...??
  • 當綁定函數被調用時,這些參數加上綁定函數本身的參數會按照順序作為原函數運行時的參數.

    ?

    該方法創建一個新函數,稱為綁定函數,綁定函數會以創建它時傳入bind方法的第一個參數作為this,傳入bind方法的第二個以及以后的參數加上綁定函數運行時本身的參數按照順序作為原函數的參數來調用原函數.

    顯然bind方法可以很好地解決上述問題。

  • $("#some-ele").click(person.hello.bind(person));??
  • //相應元素被點擊時,輸出foocoder?says?hello?world??
  • ?

    其實該方法也很容易模擬,我們看下Prototype.js中bind方法的源碼:

  • Function.prototype.bind?=?function(){??
  • ??var?fn?=?this,?args?=?Array.prototype.slice.call(arguments),?object?=?args.shift();??
  • ??return?function(){??
  • ????return?fn.apply(object,??
  • ??????args.concat(Array.prototype.slice.call(arguments)));??
  • ??};??
  • };??
  • ?

    明白了么?

    相信看完全文以后,this不再是坑~

    轉載于:https://www.cnblogs.com/kefeiGame/p/7661988.html

    總結

    以上是生活随笔為你收集整理的JavaScript中this详解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 国内精品国产成人国产三级 | 亚洲高清色图 | 国产欧美视频在线 | 男生女生操操操 | 国产一区二区自拍视频 | 亚洲激情一区二区三区 | 天天射夜夜操 | 精品成人无码久久久久久 | 性一交一乱一色一免费无遮挡 | 男人天堂久久久 | 在线视频 日韩 | 无码人妻aⅴ一区二区三区69岛 | 国产高清免费在线观看 | 激情综合文学 | 中文字幕在线精品 | 欧美成人日韩 | 中文字幕日韩人妻在线视频 | 人人妻一区二区三区 | 成人毛片18女人毛片 | 黄色三级免费 | 黑人一区二区三区四区五区 | 好男人在线观看 | 影音先锋成人 | 欧美日韩亚洲国产一区 | 成年人理论片 | 特级特黄aaaa免费看 | 18久久久 | 一起操在线 | 91精品久久久久久久久中文字幕 | 国产午夜伦鲁鲁 | 污的视频在线观看 | 国产呦系列 | 琪琪五月天 | 黄视频免费观看 | 久久久精品久久久 | 亚洲精品中文字幕在线观看 | 欧美日韩一区电影 | 欧洲av一区二区三区 | 意大利性荡欲xxxxxx | 欧美激情成人网 | 婷婷激情图片 | 中文字幕在线观看视频网站 | 中文字幕久久一区 | 波多野结衣黄色 | 综合另类 | 久久婷婷av | 免费的黄色的网站 | 免费日韩av | 国产乱人伦精品一区二区 | 国产精品探花在线观看 | 毛片网站免费观看 | 粉嫩一区二区三区 | 伊人免费在线观看高清版 | 精品一区二区三区无码按摩 | 男生和女生操操 | 色妞色视频一区二区三区四区 | 草草视频在线观看 | 亚洲精品国产精品国自产观看 | 国产91精品露脸国语对白 | 黄色大片毛片 | 成人免费观看网站 | 夜夜夜影院 | 99福利视频| av毛片观看 | www.超碰97.com| 欧美精品色呦呦 | aaaaa级少妇高潮大片免费看 | 粗大黑人巨茎大战欧美成人免费看 | 一级片在线 | 日本一区二区在线免费观看 | 无码人妻精品一区二区三区9厂 | 漂亮人妻被中出中文字幕 | 色桃av | 青青草97国产精品免费观看 | www.污视频 | 久久精品电影 | 丁香在线 | 日韩视频一区二区在线观看 | 亚洲精品乱码久久久久久 | 日韩成人在线视频 | av片免费 | 黄色一级片视频 | 91视频啊啊啊 | 青青草成人在线 | 国产chinese男男gaygay视频 | 中国av免费看 | 亚洲熟妇色自偷自拍另类 | 色av一区二区 | av先锋资源网 | 超碰人人国产 | 啪啪资源| 日本公妇乱淫免费视频一区三区 | 在线视频三区 | 欧美男同又粗又长又大 | 国产成人免费av | 男人天堂中文字幕 | 中文字幕乱码在线人视频 | 91av影院 | 国产一区二区三区视频免费观看 |