中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

apply和call怎么在JavaScript中使用

發布時間:2021-03-22 18:00:51 來源:億速云 閱讀:158 作者:Leah 欄目:web開發

本篇文章為大家展示了apply和call怎么在JavaScript中使用,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

一.apply函數定義與理解,先從apply函數出發

在MDN上,apply的定義是:

“apply()方法調用一個具有給定this值的函數,以及作為一個數組(或類似數組對象)提供的參數。”

我的理解是:apply的前面有個含有this的對象,設為A,apply()的參數里,也含有一個含有this的對象設為B。則A.apply(B),表示A代碼執行調用了B,B代碼照常執行,執行后的結果作為apply的參數,然后apply把這個結果所指代表示的this替換掉A本身的this,接著執行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)//此時aa表示的this就是aa本身
 cc._f.apply(aa._f)//此時aa._f表示的this就是aa._f本身
 
 /**
  * 此時aa._f()表示的this,就是執行后的結果本身。aa._f()執行后,沒有返回值,所以應該是undefined,而undefined作為call和apply的參數時,call和apply前面的方法 cc._f 的this會替換成全局對象window。
  * 參考MDN:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/apply 的參數說明
  */
 cc._f.apply(aa._f())

執行結果:

1.參數為aa

apply和call怎么在JavaScript中使用  

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

2.參數為aa.f

apply和call怎么在JavaScript中使用  

這兩行的打印的都是來自 cc._f 方法內的那兩句console 。aa.f 的時候應該也算是初始化,或者是整個函數當參數傳但是不執行這個參數,即 aa._f 方法沒有執行。

3.參數為aa.f()

apply和call怎么在JavaScript中使用   

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

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

 二.apply與call的區分

1.apply()

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

對于A.apply(B) / A.call(B) , 簡單講,B先執行,執行后根據結果去執行A。這個時候,用A去執行B的內容代碼,然后再執行自己的代碼。

比如:

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

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

2.call()

A.call(B, 1,2,3) 后面的參數都是獨立的參數對象,它們會被自動解析為A的參數;

比如: 

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

參數中的 ” [1,2] “,因為傳入了一個數組,相當于只傳入了第一個參數,b和c參數沒有傳。解析后變成 f2 的參數 “ [1,2],undefined ,undefined ”,執行f2方法后,打印出 [1,2],undefined ,undefined 三個值。

三.apply與call帶來的便利

1. push();

push參數是類似(a,b,c,d,e)如此傳輸的,如果在一個數組的基礎上進行傳輸另一個數組的內容,可以如下:

//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. 數組利用Math求最大和最小值

apply和call的第一個參數,如果是null或者undefined,則apply或call前面的函數會把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

上述內容就是apply和call怎么在JavaScript中使用,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

克什克腾旗| 木里| 长阳| 永顺县| 海丰县| 平陆县| 瑞丽市| 云南省| 五台县| 济宁市| 南和县| 松溪县| 文山县| 磐石市| 永定县| 永新县| 荔波县| 河间市| 景谷| 河北区| 隆尧县| 永清县| 阿尔山市| 介休市| 竹北市| 灵山县| 蒙阴县| 肥西县| 疏勒县| 潢川县| 顺义区| 饶平县| 梨树县| 潼南县| 杨浦区| 那曲县| 高邮市| 金川县| 车致| 无棣县| 白玉县|