apply()與call()

JavaScript中的每一個Function對象都有一個apply()方法和一個call()方法,它們的語法分別為:

/*apply()方法*/
function.apply(thisObj[, argArray])/*call()方法*/
function.call(thisObj[, arg1[, arg2[, [,...argN]]]]);

它們各自的定義:

apply:調用一個對象的一個方法,用另一個對象替換當前對象。例如:B.apply(A, arguments);即A對象應用B對象的方法。

call:調用一個對象的一個方法,用另一個對象替換當前對象。例如:B.call(A, args1,args2);即A對象調用B對象的方法。

它們的共同之處:

都“可以用來代替另一個對象調用一個方法,將一個函數的對象上下文從初始的上下文改變為由thisObj指定的新對象”。

它們的不同之處:

apply:最多只能有兩個參數——新this對象和一個數組argArray。如果給該方法傳遞多個參數,則把參數都寫進這個數組里面,當然,即使只有一個參數,也要寫進數組里。如果argArray不是一個有效的數組或arguments對象,那么將導致一個TypeError。如果沒有提供argArray和thisObj任何一個參數,那么Global對象將被用作thisObj,并且無法被傳遞任何參數。

call:它可以接受多個參數,第一個參數與apply一樣,后面則是一串參數列表。這個方法主要用在js對象各方法相互調用的時候,使當前this實例指針保持一致,或者在特殊情況下需要改變this指針。如果沒有提供thisObj參數,那么 Global 對象被用作thisObj。?

實際上,apply和call的功能是一樣的,只是傳入的參數列表形式不同。

示例代碼:

(1)基本用法

復制代碼
function add(a,b){return a+b;  
}
function sub(a,b){return a-b;  
}
var a1 = add.apply(sub,[4,2]);  //sub調用add的方法
var a2 = sub.apply(add,[4,2]);
alert(a1);  //6     
alert(a2);  //2

/*call的用法*/
var a1 = add.call(sub,4,2);
復制代碼

(2)實現繼承

復制代碼
function Animal(name){this.name = name;this.showName = function(){alert(this.name);    }    
}function Cat(name){Animal.apply(this,[name]);    
}var cat = new Cat("咕咕");
cat.showName();/*call的用法*/
Animal.call(this,name);
復制代碼

?(3)多重繼承

復制代碼
function Class10(){this.showSub = function(a,b){alert(a - b);}   
}function Class11(){this.showAdd = function(a,b){alert(a + b);}  
}function Class12(){Class10.apply(this);Class11.apply(this);   // Class10.call(this);//Class11.call(this);  
}var c2 = new Class12();
c2.showSub(3,1);    //2
c2.showAdd(3,1);    //4
復制代碼

?

apply的一些其他巧妙用法

(1)Math.max 可以實現得到數組中最大的一項:

因為Math.max不支持Math.max([param1,param2])也就是數組,但是它支持Math.max(param1,param2...),所以可以根據apply的特點來解決 var max=Math.max.apply(null,array),這樣就輕易的可以得到一個數組中的最大項(apply會將一個數組轉換為一個參數接一個參

數的方式傳遞給方法)

這塊在調用的時候第一個參數給了null,這是因為沒有對象去調用這個方法,我只需要用這個方法幫我運算,得到返回的結果就行,所以直接傳遞了一個null過去。

用這種方法也可以實現得到數組中的最小項:Math.min.apply(null,array)

(2)Array.prototype.push可以實現兩個數組的合并

同樣push方法沒有提供push一個數組,但是它提供了push(param1,param2...paramN),同樣也可以用apply來轉換一下這個數組,即:

var arr1=new Array("1","2","3");
var arr2=new Array("4","5","6");
Array.prototype.push.apply(arr1,arr2);    //得到合并后數組的長度,因為push就是返回一個數組的長度

也可以這樣理解,arr1調用了push方法,參數是通過apply將數組轉換為參數列表的集合

通常在什么情況下,可以使用apply類似Math.max等之類的特殊用法:

一般在目標函數只需要n個參數列表,而不接收一個數組的形式,可以通過apply的方式巧妙地解決這個問題。

//求數組中的最大值let arr = [1,2,3,4,5,6,7,8,9,10];let maxVal = Math.max.apply(null,arr);alert("數組arr中的最大值是:"+maxVal);//求數組中的最小值let minVal = Math.min.apply(null,arr);alert("數組arr中的最小值是:"+minVal);//合并兩個數組并返回新數組的長度let arr1 = new Array("1","2","3","4","5","6","7","8");let arr2 = new Array("11","22","33","44","55","66","77","88");let merge = arr1.concat(arr2);let mergeLen = Array.prototype.push.apply(arr1,arr2);console.debug(mergeLen);//16console.log(merge);//["1", "2", "3", "4", "5", "6", "7", "8", "11", "22", "33", "44", "55", "66", "77", "88"]

?

轉載于:https://www.cnblogs.com/kingchan/p/11099093.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/386562.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/386562.shtml
英文地址,請注明出處:http://en.pswp.cn/news/386562.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java基于redis實現分布式鎖(SpringBoot)

前言 分布式鎖,其實原理是就是多臺機器,去爭搶一個資源,誰爭搶成功,那么誰就持有了這把鎖,然后去執行后續的業務邏輯,執行完畢后,把鎖釋放掉。 可以通過多種途徑實現分布式鎖,例如…

請談下Android消息機制,復習指南

談起Android框架體系架構,我先提個問:什么是Android框架體系架構 ? Android系統構架是安卓系統的體系結構,android的系統架構和其操作系統一樣,采用了分層的架構,共分為四層,從高到低分別是And…

SVN Cannot merge into a working copy that has local modifications

我嘗試了 主支,分支都提交,但是依然無法合并。 最終,我在服務器上將分支刪除,然后主支在拷貝過去。 一,打開服務器資源 二,刪除分支 三,拷貝主支到分支 四,刷新分支,就能…

資深Android開發帶你入門Framework,再不刷題就晚了!

想要成為一名優秀的Android開發,你需要一份完備的知識體系,在這里,讓我們一起成長為自己所想的那樣。 本文參考了目前大部分 Android 應用啟動優化的方案,將大家的方案做一個匯總,如果你有這方面的需求,只…

K8S相關內容

常用工具:docker linux k8s kubeadm 概念 etcd 數據庫 類似redis api server 接口對外提供api 調用 可以命令 kubectl 或者 kube-proxy,能訪問etcd,事件總線 scheduler 調度決策的組件 掌握新的情況,進行決策及分布pod放在哪些n…

資深Android開發帶你入門Framework,架構師必備技能

開頭 先說一下我大概的情況吧。渣本畢業,工作已經有快兩年了,從高中就開始玩小破站。無論是學習還是日常放松都是在b站。大學主學的軟件技術專業,所以,進大學校門那一刻起,去上海bilibili工作就在心里埋下了種子。在學…

Java——線程鎖,死鎖,等待喚醒機制

一、線程鎖 線程安全問題 其實,線程安全問題都是由全局變量及靜態變量引起的。若每個線程中對全局變量、靜態變量只有讀操作,而無寫操作,一般來說,這個全局變量是線程安全的;若有多個線程同時執行寫操作,…

資深大牛帶你了解源碼!關于Android程序員最近的狀況,大廠內部資料

前言 回顧一下自己這段時間的經歷,因公司突然通知裁員,我匆匆忙忙地出去面了幾家,但最終都沒有拿到offer,我感覺今年的寒冬有點冷。公司開始第二波裁員,我決定主動拿賠償走人。后續的面試過程我做了一些準備&#xff…

AE 新建項目(一)(持續更新,做到哪算哪)

開發環境 工具:Visual Studio 2012、ArcEngine10.4.1 語言:C# 開發步驟 1、打開Visual Studio 2012,選擇新建項目,創建一個.NET Framework4的,Windows窗體應用程序。取名Demo 2、工具箱中,拖一個splitConta…

基于redis分布式鎖實現的多線程并發程序

前兩個版本的代碼 都或多或少存在一定的問題,雖然可能微乎其微,但是程序需要嚴謹再嚴謹, 第一個版本問題: 局限于單機版,依賴于 Jvm的鎖 第二個版本問題: 極端情況下,解鎖邏輯的問題&#xf…

day15 Ui自動化元素的定位

day15 元素的定位Ui自動化元素的定位1、火狐瀏覽器安裝try xpath2、元素定位思路:(1)查看頁面元素,確認能夠唯一定位到元素的屬性,比如id,文案3、學習xpath cssSelector 手寫定位方式xpath(xpat…

幾張圖可以理解GC JVM調優的內容

public class ApiPurchaseOrderServiceApp {public static void main(String[] args) throws Exception {ApiPurchaseOrderServiceApp mnew ApiPurchaseOrderServiceApp();m.compute();//棧System.out.println("ok");//方法出口}public int compute(){int a1;//局部…

靈魂拷問!一起刷完了這份1307頁的安卓面試寶典吧,不吃透都對不起自己

前言 每個程序員都有一個夢想,那就是進一線互聯網公司深造,不要跟我說你不想進去,如果給你一個這樣的平臺,不管是薪資待遇還是接觸的高度來說,對我們程序員來說都是一個機會,我以前有一個同事,…

ShardingSphere分庫分表實戰

ShardingSphere是一套開源的分布式數據庫中間件解決方案組成的生態圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(計劃中)這3款相互獨立的產品組成。 他們均提供標準化的數據分片、分布式事務和數據庫治理功能,可適用于…

靈魂拷問!細數Android開發者的艱辛歷程,成功入職阿里

什么是中年危機 根據權威數據顯示,國內IT程序員鼎盛時期是在25-27歲左右,30歲對于程序員而言完全是一個38線,接著就是轉業轉崗的事情,這一點在業界也算是一個共識了。 大學畢業步入IT行業普遍年齡也是在22歲左右,然而…

React 深度學習:ReactFiber

packages/react-reconciler/src/ReactFiber.js Fiber // A Fiber is work on a Component that needs to be done or was done. There can // be more than one per component. // Fiber 是 Component 上需要完成或已經完成工作。每個組件可以有多個 fiber。 export type Fiber…

JMM模型到并發編程

電腦:內存 L1 L2 L3 緩存 CPU ctrlatldel就可以看到 Java 有線程內存,在執行線程的時候,會從主內存把變量加載到工作內存(緩存),所以,在多線程同時改變一個靜態變量時候,實際是分開…

焦慮的移動互聯網開發者如何破局?專題解析

尷尬的35歲 不知道是哪個人提出的職場35歲就要面臨被淘汰的定律,因為35歲定律本來就是個偽命題,尤其是在IT行業! 現在年八九百萬的大學生畢業,他們雖然年輕活力,但是很多企業也將之“拒之門外”。 35歲的不要,二十幾…

17.前端路由router-07keep-alive

keep-alive是Vue提供的一個抽象組件,用來對組件進行緩存,從而節省性能, 由于是一個抽象組件,所以在v頁面渲染完畢后不會被渲染成一個DOM元素 當組件在keep-alive內被切換時組件的activated、deactivated這兩個生命 周期鉤子函數會…

jvm指令碼

建議直接復制保存至本地,研究jvm運行,執行指令非常有幫助 一、未歸類系列A 此系列暫未歸類。 指令碼 助記符 說明 0x00 nop 什么都不做 0x01 aconst_null 將null推送至棧頂 二、const系列 該系列命令主要負責把簡單的數值類型送到棧頂。該系列命令不帶參…