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

Javascript中this關(guān)鍵字指向問題的測試與詳解

 更新時(shí)間:2017年08月11日 09:54:28   作者:lanfang  
this是Javascript中一個(gè)非常容易理解錯(cuò),進(jìn)而用錯(cuò)的特性。所以下面這篇文章主要給大家介紹了關(guān)于Javascript中this關(guān)鍵字指向問題的相關(guān)資料,文中通過測試的題目考驗(yàn)大家對this的熟悉程度,需要的朋友可以參考借鑒,下面來一起看看吧。

前言

Javascript是一門基于對象的動(dòng)態(tài)語言,也就是說,所有東西都是對象,一個(gè)很典型的例子就是函數(shù)也被視為普通的對象。Javascript可以通過一定的設(shè)計(jì)模式來實(shí)現(xiàn)面向?qū)ο蟮木幊蹋渲衪his “指針”就是實(shí)現(xiàn)面向?qū)ο蟮囊粋€(gè)很重要的特性。本文將給大家詳細(xì)介紹關(guān)于Javascript中this關(guān)鍵字指向的相關(guān)內(nèi)容,讓我們先做一個(gè)小測試,如果全部答對了,恭喜你不用往下看了。

測試題目

第一題

<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

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

this

  • 指向調(diào)用函數(shù)的對象
  • 無對象調(diào)用函數(shù)/匿名函數(shù)自調(diào)用(this指向window)
  • 通過new產(chǎn)生的對象
  • apply/call調(diào)用

一、指向調(diào)用函數(shù)的對象

<script>
 // this:指向調(diào)用函數(shù)的對象
 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>
  • 全局函數(shù)(demo)屬于window對象的方法,window調(diào)用demo所以this就指向了window
  • obj調(diào)用say方法,this就指向了obj
  • fun()是全局函數(shù),而聲明的fun接收的是obj里面單純的一個(gè)函數(shù),并沒有調(diào)用(obj.say()才是調(diào)用了函數(shù)),此時(shí)的fun就是一個(gè)函數(shù)(function(){alert(this.str);}),那么當(dāng)fun()調(diào)用函數(shù)的時(shí)候,this指向的就是window
  • 是誰調(diào)用的函數(shù),那么this就指向誰

二、無對象調(diào)用函數(shù)/匿名函數(shù)自調(diào)用->this指向window

<script>
 // 2.匿名函數(shù)自執(zhí)行|匿名函數(shù)|無主函數(shù) this->window
 var username = 'zhangsan';

 // 匿名函數(shù)自執(zhí)行 this->window
 (function() {
  var username = 'lisi';
  console.log(this); // window
  alert(this.username); // zhangsan
 })()

 function demo() {
  var username = 'wangwu';

  // 無主函數(shù) this->window
  function test() {
   // this->window
   alert(this.username);
  }

  test(); // zhangsan
 }
 demo();
</script>
  • 因?yàn)槟涿瘮?shù)沒有名字,所以就掛給window了
  • test(),誰調(diào)用test那么就指向誰。當(dāng)然實(shí)驗(yàn)過,它不是window調(diào)用的,也不是demo調(diào)用的,沒有人管它,那么它就指向window。它就相當(dāng)于一個(gè)沒有主人調(diào)用它,無主函數(shù)。

三、通過new產(chǎn)生的對象

<script>
 // 3.通過new的對象:this指向產(chǎn)生的對象
 // 函數(shù)
 function Person() {
  // 屬性
  this.username = 'zhangsan';
  // 方法
  this.say = function() {
   // this->p
   console.log(this); // Person對象
   alert('我叫' + this.username);
  }
 }

 // 實(shí)例化出一個(gè)對象: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>
  • 當(dāng)我們的函數(shù)Person里面運(yùn)用了this去寫屬性和方法這種格式,那么就要通過new來讓屬性和方法變得有價(jià)值,通過new去運(yùn)用函數(shù)里面的屬性和方法

四、apply/call調(diào)用

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

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

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

注意:

1. 調(diào)用function函數(shù),但是函數(shù)內(nèi)的this指向thisObj(更改對象內(nèi)部指針)

2. 如果thisObj沒有傳參,則默認(rèn)為全局對象

3. call()/apply()聯(lián)系與區(qū)別

    聯(lián)系:功能一樣,第一個(gè)參數(shù)都是thisObj

    區(qū)別:傳遞的參數(shù)如果比較多

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

        apply()的實(shí)參是全部放置在第二個(gè)數(shù)組參數(shù)中

一個(gè)理解apply()/call()的實(shí)例:

<script>
 // apply()/call()
 function demo() {
  console.log(123);
 }

 // 調(diào)用函數(shù)的時(shí)候,demo.call()/demo.apply()最終調(diào)用的還是demo()
 demo(); // 123
 demo.call(); //123
 demo.apply(); // 123
</script>

<script>
 // call()/apply()的區(qū)別:
 // call()參數(shù)單獨(dú)再call中羅列
 // apply()的參數(shù)通過數(shù)組表示
 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的第四個(gè)用法實(shí)例

<script>
 // this的第四個(gè)用法:call(obj)/apply(obj):強(qiáng)制性的將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>
  • 如果直接調(diào)用demo里面寫的不管是obj1還是obj2,那么demo還是屬于window調(diào)用的。
  • 不管你用call還是apply最終調(diào)用的都是demo函數(shù),但它們會強(qiáng)制的this指向了obj1/obj2,強(qiáng)制的指向了它們的第一個(gè)參數(shù)對象。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • 基于Require.js使用方法(總結(jié))

    基于Require.js使用方法(總結(jié))

    下面小編就為大家?guī)硪黄赗equire.js使用方法(總結(jié))。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10
  • javascript實(shí)現(xiàn)掃雷簡易版

    javascript實(shí)現(xiàn)掃雷簡易版

    這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)掃雷簡易版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • 基于Web標(biāo)準(zhǔn)的UI組件 — 樹狀菜單(2)

    基于Web標(biāo)準(zhǔn)的UI組件 — 樹狀菜單(2)

    基于Web標(biāo)準(zhǔn)的UI組件 — 樹狀菜單(2)...
    2006-09-09
  • js中substr,substring,indexOf,lastIndexOf的用法小結(jié)

    js中substr,substring,indexOf,lastIndexOf的用法小結(jié)

    本篇文章主要是對js中substr,substring,indexOf,lastIndexOf的用法進(jìn)行了總結(jié)介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-12-12
  • js實(shí)現(xiàn)京東秒殺倒計(jì)時(shí)功能

    js實(shí)現(xiàn)京東秒殺倒計(jì)時(shí)功能

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)京東秒殺倒計(jì)時(shí)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 深入理解事件冒泡(Bubble)和事件捕捉(capture)

    深入理解事件冒泡(Bubble)和事件捕捉(capture)

    下面小編就為大家?guī)硪黄钊肜斫馐录芭?Bubble)和事件捕捉(capture)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-05-05
  • JavaScript中的splice方法用法詳解

    JavaScript中的splice方法用法詳解

    JavaScript中的splice主要用來對js中的數(shù)組進(jìn)行操作,包括刪除,添加,替換等。這篇文章主要介紹了JavaScript中的splice方法用法詳解的相關(guān)資料,需要的朋友可以參考下
    2016-07-07
  • js判斷瀏覽器的環(huán)境(pc端,移動(dòng)端,還是微信瀏覽器)

    js判斷瀏覽器的環(huán)境(pc端,移動(dòng)端,還是微信瀏覽器)

    這篇文章主要介紹了js判斷瀏覽器的環(huán)境(pc端,移動(dòng)端,還是微信瀏覽器),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 自定義排序算法在JavaScript中的應(yīng)用小結(jié)

    自定義排序算法在JavaScript中的應(yīng)用小結(jié)

    這篇文章主要介紹了自定義排序算法在JavaScript中的應(yīng)用,通過自定義排序函數(shù),我們能夠精確控制數(shù)組元素的排序邏輯,從而滿足各種復(fù)雜的應(yīng)用場景,需要的朋友可以參考下
    2024-12-12
  • bootstrap table表格插件使用詳解

    bootstrap table表格插件使用詳解

    這篇文章主要為大家詳細(xì)介紹了bootstrap table表格插件使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05

最新評論

衢州市| 曲靖市| 富平县| 安顺市| 体育| 金华市| 青阳县| 浏阳市| 广东省| 神农架林区| 乡宁县| 安陆市| 桐城市| 泽州县| 麻栗坡县| 锡林郭勒盟| 巴塘县| 邵东县| 岱山县| 巩留县| 舟曲县| 平南县| 山西省| 蓬安县| 和平区| 通城县| 敦煌市| 富阳市| 茂名市| 桐城市| 靖边县| 庐江县| 兴义市| 吉木萨尔县| 镇雄县| 固始县| 平乐县| 台湾省| 禹州市| 格尔木市| 寻乌县|