apply()與call()的區別

一直都沒太明白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的方式巧妙地解決這個問題。

轉載于:https://www.cnblogs.com/snowhite/p/9225115.html

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

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

相關文章

java代碼執行了兩次_Java中JComboBox的itemStateChanged事件執行兩次的解釋

今天做項目,用到了JComboBox,即下拉列表框。為了在被選中的項發生改變時獲得被選中的項,所以使用的ItemStateChanged事件,可是問題就來了,每次觸發該事件,它都執行兩次,屢試不爽。一開始以為是代…

python連接mongo_使用簡單的Python連接訪問MongoDB

繼續來聊MongoDB。MongoDB作為了一個數據庫產品軟件,除了服務器Server端進程(mongod)外,還提供了比較豐富的訪問連接接口。我們最常用的就是兩個類型,一個是原生mongo shell,另一個就是應用程序語言訪問接口。1、從Mongo Shell到應…

spring與mybatis三種整合方法

原文鏈接:http://www.cnblogs.com/wangmingshun/p/5674633.html ------------------------------------------------------------------------------------------------- 1、采用MapperScannerConfigurer,它將會查找類路徑下的映射器并自動將它們創建成…

js常用的2中排序方法:冒泡排序和快速排序

冒泡排序:例如9 4 5 6 8 3 2 7 10 1 首先:9和4比較 4放前 4 9 5 6 8 3 2 7 10 1 4和5比較 4不動 4 9 5 6 8 3 2 7 10 1 4和6比較 4不動 4 9 5 6 8 3 2 7 10 1 4和3比較 3放前 3 9 5 6 8 4 2 7 10 1 3和2比較 2放前 2 9 5 6 8…

java 注冊頁面正則式_Java使用正則表達式對注冊頁面進行驗證功能實現

本文給大家介紹java使用正則表達式對注冊頁面進行驗證的代碼,代碼如下所示:package regex;import java.util.Scanner;import java.util.regex.Matcher;import java.util.regex.Pattern;public class registered {public static void main(String[] args)…

python 編程效率_如何有效提升數據分析效率?五大Python技巧

如何有效提升數據分析效率?相信這是所有數據分析工作者都想解決的問題。本文整理了五大python技巧,分別是Pandas Profiling;使用 Cufflinks 和 Plotly 繪制 Pandas 數據;IPython 魔術命令;Jupyter 中的格式編排&#x…

please select a vaild python interpret

當 JetBrains PyCharm 2017.1.3 x64 遇到 please select a vaild python interpret 錯誤時: 進入PyCharm setting 選項,搜索 interpret

Grafana分析Nginx日志

配置Groub by -Terms時報錯,提示需要設置fielddatatrue,報錯內容大概如下: "Fielddata is disabled on text fields by default ... " 解決方法如下: https://www.elastic.co/guide/en/elasticsearch/reference/curren…

php curl json post請求_php post請求發送json對象數據參數

網頁中發送請求時,大部分情況都參數以鍵值組合發送數據的,而一些第三方如java開發的接口中需要發送post請求,請求參數為json類型。既然要發送json數據,首頁我們需要在請求頭中定義數據類型為json,告訴服務器客服端發送…

python刪除鏈表中的最小元素_LintCode Python 入門級題目 刪除鏈表元素、整數列表排序...

刪除鏈表元素:循環列表head,判斷當前指針pre.next的val是否等于val,如果是,當前pre重指向pre.next.next,直至pre.next Null# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.va…

IDEA 更換主題

1、下載主題文件 百度或者谷歌 IDEA themes 網址有可能會變化。目前是 http://color-themes.com 選擇自己喜歡的顏色,下載。 2、導入主題文件 File----Import Setting 導入下載的jar文件,一路確認,idea會自動重啟。 3、選擇主題 點擊…

【CentOS 7筆記】cp、mv、文檔查看方式

2019獨角獸企業重金招聘Python工程師標準>>> 一. copy 常用cp -r/R #拷貝目錄,遞歸 cp -i #覆蓋時會提示,默認項 cp -p #保留源目錄或源文件的屬性 cp -b #源文目與目的文目建立鏈接,鏈接 cp -f #強制覆蓋 cp -v …

php 情書,php趣味編程 - php輸出笛卡爾情書的秘密

/*笛卡爾情書的秘密心形圖案的實現。重點是心形函數ra(1-sin),據說這是笛卡爾死前寄出的最后一封情書內容。這里面隱藏著一個刻骨銘心的秘密;“一生只為等待能手繪這個函數給我的人”*/$width 500;$height 500;header("Content-type: image/gif");$img …

python 月報_python實踐--月報分析之獲取jira缺陷數據

首先安裝jira,同其他第三方庫,直接可以 easy_install jira。判斷jira是否按轉成功輸入:from jira import JIRA,如果沒有報錯則說明安裝成功;#連接jirajira JIRA(“http://jira地址”,basic_auth (“用戶名…

JAVA中的native

native主要用于方法上,簡單介紹如下: 1、一個native方法就是一個Java調用非Java代碼的接口。一個native方法是指該方法的實現由非Java語言實現,比如用C或C實現。 2、在定義一個native方法時,并不提供實現體(比較像定…

script filename php,PHP $_SERVER['SCRIPT_FILENAME'] 與 __FILE__ 的區別

PHP $_SERVER[SCRIPT_FILENAME] 與 __FILE__通常情況下,PHP $_SERVER[SCRIPT_FILENAME] 與 __FILE__ 都會返回 PHP 文件的完整路徑(絕對路徑)與文件名:echo SCRIPT_FILENAME 為:,$_SERVER[SCRIPT_FILENAME];echo ;echo __FILE__ 為&#xff1…

015. 深入JVM學習—Java引用類型

2019獨角獸企業重金招聘Python工程師標準>>> 1. 引用類型劃分 強引用:當內存不足時,JVM寧可出現“OutOfMemoryError”錯誤停止,也需要進行保存,并且不會將此空間回收。 軟引用:當內存不足的時候&#xff0…

python人臉關鍵點識別_用Face++實現人臉關鍵點檢測

最近看了一篇很有意思的文章 http://matthewearl.github.io/2015/07/28/switching-eds-with-python/ ,本來想自己復現一下,后來發現自己太菜,用了一整天只完成了不到一半,最近要找工作了,看書看的有點煩,本…

【東營seo】SEO發展下的大機遇

【東營seo】SEO發展下的大機遇 seo優化越來越難做,很多的人都開始懷疑seo優化沒有價值。的確現如今seo優化與十年前比確實不是一個級別的,即便如此,seo優化還是存在其持續發展的機制。  自然搜索排名不再是唯一的競爭點,語音搜索…

手機整屏顯示數據php,完美解決手機網頁大背景不能鋪完整個屏幕的超級代碼

html,body{min-height:100%;} 優化 html{min-height:100%;} html,body{min-height:100%;}body{background-image:url(bg_640.jpg);background-size:cover;babackground-repeat:no-repeat;}.main{padding-top:141%;text-align:cenhtml,body{min-height:100%;}優化html{min-heigh…