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

js中apply和call的理解與使用方法

 更新時(shí)間:2019年11月27日 08:34:56   作者:烈霧風(fēng)雨城  
這篇文章主要給大家介紹了關(guān)于js中apply和call的理解與使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用js具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

前言

關(guān)于call和apply,以前也思考良久,很多時(shí)候都以為記住了,但是,我太難了。今天我特地寫下筆記,希望可以完全掌握這個(gè)東西,也希望可以幫助到任何想對(duì)學(xué)習(xí)這個(gè)東西的同學(xué)。

一.apply函數(shù)定義與理解,先從apply函數(shù)出發(fā)

在MDN上,apply的定義是:

“apply()方法調(diào)用一個(gè)具有給定this值的函數(shù),以及作為一個(gè)數(shù)組(或類似數(shù)組對(duì)象)提供的參數(shù)?!?/p>

我的理解是:apply的前面有個(gè)含有this的對(duì)象,設(shè)為A,apply()的參數(shù)里,也含有一個(gè)含有this的對(duì)象設(shè)為B。則A.apply(B),表示A代碼執(zhí)行調(diào)用了B,B代碼照常執(zhí)行,執(zhí)行后的結(jié)果作為apply的參數(shù),然后apply把這個(gè)結(jié)果所指代表示的this替換掉A本身的this,接著執(zhí)行A代碼。

比如:

var aa = {
  _name:111,
  _age:222,
  _f:function(){
   console.log(this)
   console.log(this._name)
  }
 }
 var cc = {
  _name:0,
  _age:0,
  _f:function(){
   console.log(this)
   console.log(this._name)
  }
 }
 cc._f.apply(aa)//此時(shí)aa表示的this就是aa本身
 cc._f.apply(aa._f)//此時(shí)aa._f表示的this就是aa._f本身
 
 /**
  * 此時(shí)aa._f()表示的this,就是執(zhí)行后的結(jié)果本身。aa._f()執(zhí)行后,沒有返回值,所以應(yīng)該是undefined,而undefined作為call和apply的參數(shù)時(shí),call和apply前面的方法 cc._f 的this會(huì)替換成全局對(duì)象window。
  * 參考MDN:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/apply 的參數(shù)說明
  */
 cc._f.apply(aa._f())

執(zhí)行結(jié)果:

1.參數(shù)為aa

  

這兩行的打印的都是來自 cc._f 方法內(nèi)的那兩句console 。aa的時(shí)候算是初始化,里面的 aa._f 方法沒有執(zhí)行。

2.參數(shù)為aa.f

  

這兩行的打印的都是來自 cc._f 方法內(nèi)的那兩句console 。aa.f 的時(shí)候應(yīng)該也算是初始化,或者是整個(gè)函數(shù)當(dāng)參數(shù)傳但是不執(zhí)行這個(gè)參數(shù),即 aa._f 方法沒有執(zhí)行。

3.參數(shù)為aa.f()

   

這四行的打印,前面兩行來自 aa._f() 方法執(zhí)行打印的;后面兩行是來自cc._f()方法打印的。

后兩行解析:aa._f()執(zhí)行后,沒有返回值,所以是undefined,在apply執(zhí)行解析后,cc._f()的this變成的window,所以打印了window。window里面沒有_name這個(gè)屬性,所以u(píng)ndefined。

 二.apply與call的區(qū)分

1.apply()

A.apply(B, [1,2,3]) 后面的參數(shù)是arguments對(duì)象或類似數(shù)組的對(duì)象,它會(huì)被自動(dòng)解析為A的參數(shù);

對(duì)于A.apply(B) / A.call(B) , 簡單講,B先執(zhí)行,執(zhí)行后根據(jù)結(jié)果去執(zhí)行A。這個(gè)時(shí)候,用A去執(zhí)行B的內(nèi)容代碼,然后再執(zhí)行自己的代碼。

比如:

var f1 = function(a,b){
  console.log(a+b)
 }
 var f2 = function(a,b,c){
  console.log(a,b,c)
 }
 f2.apply(f1,[1,2])//1 2 undefined

先執(zhí)行f1,f1執(zhí)行后(f1是f1,不是f1()執(zhí)行方法,所以console.log(a+b)這行代碼并沒有執(zhí)行,相當(dāng)于,初始化了代碼f1),由于沒有返回值,所以結(jié)果是undefined,f2執(zhí)行的時(shí)候this指向window;參數(shù)中的 ” [1,2] “,解析后變成 f2 的參數(shù) “ 1,2,undefined ”,執(zhí)行f2方法后,打印出1,2,undefined三個(gè)值

2.call()

A.call(B, 1,2,3) 后面的參數(shù)都是獨(dú)立的參數(shù)對(duì)象,它們會(huì)被自動(dòng)解析為A的參數(shù);

比如: 

var f1 = function(a,b){
  console.log(a+b)
 }
 var f2 = function(a,b,c){
  console.log(a,b,c)
 }
 f2.call(f1,[1,2])//[1,2] undefined undefined
 f2.call(f1,1,2)//1 2 undefined

參數(shù)中的 ” [1,2] “,因?yàn)閭魅肓艘粋€(gè)數(shù)組,相當(dāng)于只傳入了第一個(gè)參數(shù),b和c參數(shù)沒有傳。解析后變成 f2 的參數(shù) “ [1,2],undefined ,undefined ”,執(zhí)行f2方法后,打印出 [1,2],undefined ,undefined 三個(gè)值。

三.apply與call帶來的便利

1. push();

push參數(shù)是類似(a,b,c,d,e)如此傳輸?shù)?,如果在一個(gè)數(shù)組的基礎(chǔ)上進(jìn)行傳輸另一個(gè)數(shù)組的內(nèi)容,可以如下:

//apply用法
 var arr = new Array(1,2,3)
 var arr1 = new Array(11,21,31)
 Array.prototype.push.apply(arr,arr1)
 console.log(arr)//[1, 2, 3, 11, 21, 31]
 
 //call用法
 var arr = new Array(1,2,3)
 var arr1 = new Array(11,21,31)
 Array.prototype.push.call(arr,arr1[0],arr1[1],arr1[2])
 console.log(arr)//[1, 2, 3, 11, 21, 31]

2. 數(shù)組利用Math求最大和最小值

apply和call的第一個(gè)參數(shù),如果是null或者undefined,則apply或call前面的函數(shù)會(huì)把this指向window

//apply的用法
 var _maxNum = Math.max.apply(null,[1,3,2,4,5])
 console.log(_maxNum)//5
 var _minNum = Math.min.apply(null,[1,3,2,4,5])
 console.log(_minNum)//1
 
 //call的用法
 var _maxNum = Math.max.call(null,1,3,2,4,5)
 console.log(_maxNum)//5
 var _minNum = Math.min.call(null,1,3,2,4,5)
 console.log(_minNum)//1

 四.總結(jié)

簡而言之,apply和call函數(shù)的第一個(gè)參數(shù)都是用來替換this指向的對(duì)象;apply的第二個(gè)參數(shù)使用arguments或者類似數(shù)組的參數(shù)進(jìn)行傳參,call的第二個(gè)或以上的參數(shù),使用獨(dú)立單位,一個(gè)一個(gè)進(jìn)行傳參;執(zhí)行順序是apply或call的第一個(gè)參數(shù)先執(zhí)行得到結(jié)果,然后執(zhí)行apply或call前面的函數(shù),執(zhí)行的時(shí)候用已經(jīng)執(zhí)行的結(jié)果所指代的this去執(zhí)行。apply和call的使用除了參數(shù)上的使用方式不同外,功能是一模一樣的。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • JavaScript語法約定和程序調(diào)試原理解析

    JavaScript語法約定和程序調(diào)試原理解析

    這篇文章主要介紹了JavaScript語法約定和程序調(diào)試原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Javascript中的this綁定介紹

    Javascript中的this綁定介紹

    在Javascript里,函數(shù)被調(diào)用的時(shí)候,除了接受聲明是定義的形式參數(shù),每一個(gè)函數(shù)還接受兩個(gè)附加的參數(shù):this和arguments。
    2011-09-09
  • 基于jquery實(shí)現(xiàn)全屏滾動(dòng)效果

    基于jquery實(shí)現(xiàn)全屏滾動(dòng)效果

    相信大家都很喜歡網(wǎng)易郵箱、QQ瀏覽器的官方網(wǎng)站這樣的可全屏滾動(dòng)的效果,也許更多的朋友想把全屏滾動(dòng)效果做到自己的網(wǎng)站中,本文就帶著大家一起完成這個(gè)效果
    2015-11-11
  • js判斷空對(duì)象的實(shí)例(超簡單)

    js判斷空對(duì)象的實(shí)例(超簡單)

    下面小編就為大家?guī)硪黄猨s判斷空對(duì)象的實(shí)例(超簡單)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-07-07
  • JavaScript中0和

    JavaScript中0和""比較引發(fā)的問題

    這篇文章主要介紹了JavaScript中0和""比較引發(fā)的問題,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-05-05
  • 25個(gè)讓你眼前一亮的JavaScript代碼技巧分享

    25個(gè)讓你眼前一亮的JavaScript代碼技巧分享

    學(xué)習(xí)強(qiáng)大的JavaScript一行代碼,能夠節(jié)省你的時(shí)間和代碼量,所以本文為大家整理了25個(gè)JavaScript實(shí)用代碼技巧,感興趣的小伙伴可以了解一下
    2023-07-07
  • 在JavaScript中讓this保持正確的指向的解決方案

    在JavaScript中讓this保持正確的指向的解決方案

    這篇文章主要介紹了關(guān)于在 JavaScript 中如何讓 this 保持正確的指向的解決方案,文中給大家介紹了三種解決方案,使用閉包,使用箭頭函數(shù)和換綁 this這三種方法,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2024-01-01
  • layui異步加載table表中某一列數(shù)據(jù)的例子

    layui異步加載table表中某一列數(shù)據(jù)的例子

    今天小編就為大家分享一篇layui異步加載table表中某一列數(shù)據(jù)的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • JavaScript 高仿真可控彈簧振子實(shí)現(xiàn)代碼

    JavaScript 高仿真可控彈簧振子實(shí)現(xiàn)代碼

    我剛學(xué)JavaScript ,看見一些牛人寫了許多特效,我也花了一天寫了一個(gè)彈簧振子,完全獨(dú)創(chuàng),沒有借鑒任何人的代碼.
    2009-10-10
  • 一個(gè)多瀏覽器支持的背景變暗的div并可拖動(dòng)提示窗口功能的代碼

    一個(gè)多瀏覽器支持的背景變暗的div并可拖動(dòng)提示窗口功能的代碼

    兼容IE、Firefox、Opera前幾天在網(wǎng)上找了許多資料,看了不少兄弟的源碼,一直找不到合適的,要不就是拖動(dòng)有問題,要不就是不兼容Firefox,所以自已寫了一個(gè),下面是代碼:
    2008-04-04

最新評(píng)論

紫阳县| 丰都县| 莎车县| 岱山县| 贵德县| 阿勒泰市| 桦川县| 连南| 襄樊市| 青州市| 广德县| 双辽市| 商洛市| 安泽县| 夹江县| 双江| 九台市| 嘉鱼县| 平谷区| 揭阳市| 洛扎县| 池州市| 晴隆县| SHOW| 乌鲁木齐县| 龙南县| 浦北县| 高密市| 庆元县| 永济市| 恩平市| 偏关县| 镇原县| 南京市| 临夏市| 龙岩市| 肇庆市| 双柏县| 西贡区| 巨鹿县| 永清县|