日韩性视频-久久久蜜桃-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详解的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 日韩成人精品一区二区 | 夜夜综合网 | 性色av网址| 体内精视频xxxxx | 黄色网址网站 | av毛片在线免费看 | 亚洲视频一区二区三区在线观看 | 欧美做爰啪啪xxxⅹ性 | 九九色在线| 超碰免费观看 | 国模一区二区 | 国产高清在线观看 | 精品人妻无码一区二区 | 天天色播 | 亚洲成人免费在线 | 久久久久久九九九 | 欧美无马 | jizz日本大全 | 一卡二卡三卡在线 | 黄色无毒网站 | 黄色三级生活片 | 中文字幕 欧美日韩 | 成人aⅴ视频 | 青青草自拍视频 | 日韩精品成人免费观看视频 | 久久精品成人一区二区三区蜜臀 | 黄色a级免费 | 欧美性受xxxxxx黑人xyx性爽 | 免费黄色在线播放 | 色婷婷九月 | 久久久999久久久 | 欧美色图一区 | 中文字幕精品久久久久人妻红杏1 | 欧洲精品免费一区二区三区 | 好男人资源| 永久免费快色 | 制服.丝袜.亚洲.中文.综合 | 插吧插吧网 | 日韩香蕉网 | 国产在线a视频 | 少妇又紧又色 | 黄色三级大片 | 免费无码不卡视频在线观看 | 91免费成人 | 在线观看国产成人 | 手机在线毛片 | www.日韩在线 | 日韩欧美精品国产 | 久久99精品久久久水蜜桃 | 黑人毛片网站 | 亚欧美色图 | 欧美xxxxxx片免费播放软件 | 熟女俱乐部一区二区视频在线 | 亚洲欧美精品一区二区 | 91国偷自产一区二区三区女王 | 动漫美女揉胸 | 成人亚洲天堂 | 欧美aa| 18深夜在线观看免费视频 | 成人高潮片免费 | 91丨porny在线 | 玖玖综合网 | av网站免费看 | 在线观看黄色片网站 | 国产激情综合 | 亚拍一区 | 成人中文网 | 97精品视频在线 | 成人动漫一区二区三区 | 国产大片aaa | 看污网站| 国产精品久久久久久网站 | 啪视频免费 | 网爆门在线 | 中文字幕在线不卡 | 动漫av网站免费观看 | 日韩欧美高清dvd碟片 | 国产明星换脸xxxx色视频 | 伊人三区 | 亚洲成年人网站在线观看 | 久久成人激情 | 久久久久成人精品无码中文字幕 | 毛片999 | 日韩精品一区二区三区丰满 | 亚洲欧美日本另类 | 在线观看免费黄网站 | 日韩欧美中文字幕在线播放 | 亚洲色精品三区二区一区 | 中文字幕av久久爽一区 | 91无毒不卡 | 韩国性经典xxxxhd | 欧美第四页 | 91精品视频免费观看 | 少妇综合网 | 老司机精品视频在线 | 欧美精品在线一区 | 丰满大乳少妇在线观看网站 | 精品人妻一区二区三 | 懂色av蜜臀av粉嫩av分享吧最新章节 |