亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Javascript中this關鍵字指向問題的測試與詳解

2019-11-19 15:50:26
字體:
來源:轉載
供稿:網友

前言

Javascript是一門基于對象的動態語言,也就是說,所有東西都是對象,一個很典型的例子就是函數也被視為普通的對象。Javascript可以通過一定的設計模式來實現面向對象的編程,其中this “指針”就是實現面向對象的一個很重要的特性。本文將給大家詳細介紹關于Javascript中this關鍵字指向的相關內容,讓我們先做一個小測試,如果全部答對了,恭喜你不用往下看了。

測試題目

第一題

<script> var str = 'zhangsan'; function demo() {  var str = 'lisi';  alert(this.str); } window.demo(); // ?? var obj = {  str: "wangwu",  say: function() {   alert(this.str);  } } obj.say(); // ?? var fun = obj.say; window.fun(); // ??</script>

第二題

<script> var username = 'zhangsan'; (function() {  var username = 'lisi';  alert(this.username); // ?? })() function demo() {  var username = 'wangwu';  function test() {   alert(this.username);  }  test(); // ?? } demo();</script>

第三題

<script> function Person() {  this.username = 'zhangsan';  this.say = function() {   alert('我叫' + this.username);  } } var p = new Person(); p.say(); // ?? var p1 = new Person(); p1.say(); // ??</script>

第四題

<script> var username = 'zhangsan'; function demo() {  alert(this.username) } var obj1 = {  username: "lisi" }; var obj2 = {  username: "wangwu" }; demo(); // ?? demo(obj1); // ?? demo(obj2); // ?? demo.call(obj1); // ??  demo.apply(obj2); // ??</script>

答案

  • 第一題:zhangsan wangwu zhangsan
  • 第二題:zhangsan zhangsan
  • 第三題:我叫zhangsan 我叫zhangsan
  • 第四題:zhangsan zhangsan zhangsan lisi wangwu

(往下看,下面有詳細解析哦)

this

  • 指向調用函數的對象
  • 無對象調用函數/匿名函數自調用(this指向window)
  • 通過new產生的對象
  • apply/call調用

一、指向調用函數的對象

<script> // this:指向調用函數的對象 var str = 'zhangsan'; function demo() {  var str = 'lisi';  //this->window  console.log(this);  alert(this.str); } window.demo(); // zhangsan var obj = {  str: "wangwu",  say: function() {   // this->obj   alert(this.str);  } } obj.say(); // wangwu var fun = obj.say; window.fun(); // zhangsan</script>
  • 全局函數(demo)屬于window對象的方法,window調用demo所以this就指向了window
  • obj調用say方法,this就指向了obj
  • fun()是全局函數,而聲明的fun接收的是obj里面單純的一個函數,并沒有調用(obj.say()才是調用了函數),此時的fun就是一個函數(function(){alert(this.str);}),那么當fun()調用函數的時候,this指向的就是window
  • 是誰調用的函數,那么this就指向誰

二、無對象調用函數/匿名函數自調用->this指向window

<script> // 2.匿名函數自執行|匿名函數|無主函數 this->window var username = 'zhangsan'; // 匿名函數自執行 this->window (function() {  var username = 'lisi';  console.log(this); // window  alert(this.username); // zhangsan })() function demo() {  var username = 'wangwu';  // 無主函數 this->window  function test() {   // this->window   alert(this.username);  }  test(); // zhangsan } demo();</script>
  • 因為匿名函數沒有名字,所以就掛給window了
  • test(),誰調用test那么就指向誰。當然實驗過,它不是window調用的,也不是demo調用的,沒有人管它,那么它就指向window。它就相當于一個沒有主人調用它,無主函數。

三、通過new產生的對象

<script> // 3.通過new的對象:this指向產生的對象 // 函數 function Person() {  // 屬性  this.username = 'zhangsan';  // 方法  this.say = function() {   // this->p   console.log(this); // Person對象   alert('我叫' + this.username);  } } // 實例化出一個對象:p就具有了username屬性和say方法 var p = new Person(); console.log(p); // Person對象 console.log(p.username); // zhangsan p.say(); // 我叫zhangsan // this->p1 var p1 = new Person(); p1.say(); // Person對象 我叫zhangsan</script>
  • 當我們的函數Person里面運用了this去寫屬性和方法這種格式,那么就要通過new來讓屬性和方法變得有價值,通過new去運用函數里面的屬性和方法

四、apply/call調用

首先我們來了解下apply()/call()是個什么東西呢?

apply()/call():最終是調用function,只不過內部的this指向了thisObj

function.call([thisObj[,arg1[, arg2[, [,.argN]]]]])function.apply([thisObj[,argArray]])

注意:

1. 調用function函數,但是函數內的this指向thisObj(更改對象內部指針)

2. 如果thisObj沒有傳參,則默認為全局對象

3. call()/apply()聯系與區別

    聯系:功能一樣,第一個參數都是thisObj

    區別:傳遞的參數如果比較多

        call()的實參就是一一列出

        apply()的實參是全部放置在第二個數組參數中

一個理解apply()/call()的實例:

<script> // apply()/call() function demo() {  console.log(123); } // 調用函數的時候,demo.call()/demo.apply()最終調用的還是demo() demo(); // 123 demo.call(); //123 demo.apply(); // 123</script><script> // call()/apply()的區別: // call()參數單獨再call中羅列 // apply()的參數通過數組表示 function demo(m, n, a, b) {  alert(m + n + a + b); } demo(1, 5, 3, 4); // 13 demo.call(null, 1, 5, 3, 4); // 13 demo.apply(null, [1, 5, 3, 4]); // 13</script>

this的第四個用法實例

<script> // this的第四個用法:call(obj)/apply(obj):強制性的將this指向了obj var username = 'zhangsan'; function demo() {  alert(this.username) } var obj1 = {  username: "lisi" }; var obj2 = {  username: "wangwu" }; // call()/apply():打劫式的改變了this的指向 demo(); // zhangsan demo(obj1); //zhangsan demo(obj2); //zhangsan demo.call(obj1); // lisi  demo.apply(obj2); // wangwu</script>
  • 如果直接調用demo里面寫的不管是obj1還是obj2,那么demo還是屬于window調用的。
  • 不管你用call還是apply最終調用的都是demo函數,但它們會強制的this指向了obj1/obj2,強制的指向了它們的第一個參數對象。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩成人av在线播放| 国产精品∨欧美精品v日韩精品| 91精品在线观| 538国产精品一区二区在线| 欧美色视频日本版| 亚洲国产天堂久久综合网| 国产不卡一区二区在线播放| 91在线精品视频| 法国裸体一区二区| 欧美在线一级视频| 国产精品亚洲аv天堂网| 91香蕉国产在线观看| 亚洲aⅴ男人的天堂在线观看| 欧美香蕉大胸在线视频观看| 伊人久久久久久久久久| 欧美成人久久久| 午夜精品理论片| 国产精品美女主播在线观看纯欲| 国产a级全部精品| 久久视频在线观看免费| 在线视频欧美日韩精品| 亚洲二区中文字幕| 日韩精品在线免费播放| 青草热久免费精品视频| 国产精品吹潮在线观看| 国产精品亚洲激情| 日本精品在线视频| 亚洲精品日韩激情在线电影| 91精品久久久久久久久久久久久| 国内精品免费午夜毛片| 欧美日本亚洲视频| 精品国产区一区二区三区在线观看| 91精品国产自产在线老师啪| 亚洲一级片在线看| 日韩大陆毛片av| 国产日韩在线精品av| 久久噜噜噜精品国产亚洲综合| 日韩精品中文字幕在线| 成人av番号网| 久久久久久国产三级电影| 欧美国产亚洲精品久久久8v| 日韩美女免费线视频| 日韩视频亚洲视频| 国产成人久久久精品一区| 亚洲精品av在线播放| 久久99精品视频一区97| 久久人人97超碰精品888| 视频在线一区二区| 久久国产精品久久久| 国产欧美精品va在线观看| 这里只有精品视频在线| 成人黄色免费看| 国产精品久久久久久久久久三级| 最新亚洲国产精品| 97超碰国产精品女人人人爽| 国产精品嫩草影院久久久| 国产精品高精视频免费| xxav国产精品美女主播| 欧洲一区二区视频| 亚洲综合一区二区不卡| 欧美性生交大片免网| 国产日韩中文字幕在线| 久久成年人免费电影| 日韩av一区在线观看| 亚洲高清久久网| 98精品国产自产在线观看| 国产精品久久电影观看| 亚洲香蕉伊综合在人在线视看| 秋霞av国产精品一区| 国产精品丝袜久久久久久高清| 色噜噜狠狠狠综合曰曰曰88av| 伊人久久综合97精品| 成人午夜激情网| 色综合色综合久久综合频道88| 精品国产一区二区三区久久狼5月| 欧美一区三区三区高中清蜜桃| 色综合久久久久久中文网| 久久久视频在线| 欧美限制级电影在线观看| 国产精品一区二区久久精品| 国产成人精品av| 国产精品久久久久久久一区探花| 孩xxxx性bbbb欧美| 日本一区二区在线播放| 精品久久久久久国产| 国产视频久久网| 色哟哟亚洲精品一区二区| 亚洲精品一区在线观看香蕉| 亚洲欧洲日产国产网站| 91免费在线视频| 日韩高清人体午夜| 国模gogo一区二区大胆私拍| 欧美俄罗斯乱妇| 日本欧美一二三区| 国产精欧美一区二区三区| 91在线高清视频| 亚洲视频在线观看网站| 国产亚洲欧洲高清一区| 亚洲成av人片在线观看香蕉| 日韩精品在线第一页| 狠狠色狠色综合曰曰| 欧美激情一区二区三区高清视频| 精品国产一区二区三区四区在线观看| 孩xxxx性bbbb欧美| 最新国产精品拍自在线播放| 欧美激情xxxx性bbbb| 国产91精品高潮白浆喷水| 91精品久久久久久久久青青| 日韩高清a**址| 亚洲欧美日本另类| 精品毛片三在线观看| 日韩经典中文字幕| xx视频.9999.com| 性色av一区二区三区红粉影视| 亚洲国产精久久久久久久| 精品久久久久久中文字幕一区奶水| 欧美黑人极品猛少妇色xxxxx| 亚洲免费人成在线视频观看| 亚洲国产高清高潮精品美女| 中文字幕一区日韩电影| 欧美国产在线电影| 亚洲精品免费av| 国产精品日韩一区| 日韩av在线精品| 亚洲另类欧美自拍| 在线视频一区二区| 欧美专区在线视频| 成人午夜激情免费视频| 欧美日韩国产黄| 国产精品成人一区| 一道本无吗dⅴd在线播放一区| 欧美成人久久久| 欧美性xxxxxxx| 久久人人爽人人爽人人片av高请| 九九热99久久久国产盗摄| 成人黄色激情网| 国产成人精品一区二区三区| 8090理伦午夜在线电影| 国产精品大陆在线观看| 亚洲国产天堂久久国产91| 国产精品第一第二| 欧美性猛交xxxx免费看| 日韩欧亚中文在线| 国产女人精品视频| 亚洲天堂av高清| 国产精品中文久久久久久久| 国产精品国产三级国产专播精品人| 日韩性xxxx爱| 日韩高清电影免费观看完整| 欧洲精品在线视频| 欧美午夜宅男影院在线观看| 国产自产女人91一区在线观看| 亚洲在线观看视频网站| 亚洲欧美日韩区| 欧美—级高清免费播放| 日韩在线观看免费av| 久久中文久久字幕| 亚洲一区二区三区视频| 久久精品国产综合| 国产精品久久一区| 国产精品一区二区女厕厕| 日韩在线视频线视频免费网站| www.日本久久久久com.| 亚洲天堂av网|