標籤:簡單 文法 call ons 沒有 簡單的 一個 window 應用
在這裡主要解決apply以及call的以下幾個問題:
(1)call與apply的常見用法
(2)call與apply的區別
1.首先我們瞭解一下call與apply用法的基本定義:
apply:方法能劫持另外一個對象的方法,繼承另外一個對象的屬性.
fn.apply(obj,args)
obj:劫持函數fn方法的對象,常見將obj用this代替並用實際對象對其進行引用的方式;
args:可以看做為一個數組,它將參數傳遞給fn;
fn.call(obj,[param1[,param2[,…[paramN]]]])
apply與call的區別僅限於參數方面,call()方法接受的是若干個參數的列表,而apply()方法接受的是一個包含多個參數的數組。這裡我們舉一個例子來進行對比
function partial(fn, str1, str2) { function result(str3) { return fn.call(this, str1, str2, str3); } return result;}
function partial(fn, str1, str2) { function result(str3) { return fn.apply(this, [str1, str2, str3]); } return result;}
另外需要注意,在沒有對象對apply函數進行調用時,this可以用null代替,this指向全域變數window;
2.我們再來看一個簡單的apply應用
<script> function argsAsArray(fn, arr) { return fn.apply(this, arr) } console.log( argsAsArray( function (greeting, name, punctuation) { return greeting + ‘, ‘ + name + (punctuation || ‘!‘); }, [‘Hello‘, ‘Ellie‘, ‘!‘]) )</script>
分析:fn.apply(this,arr) 在console.log中,我們建立實體物件,此時this即代表argsAsArray(…){…}。返回結果即為Hello,Ellie!
這裡需要注意一點,我們知道,調用argsAsArry對象時,我們需要的不是數組,而是一個個參數,實現這種操作是因為apply可以將一個數組預設的轉換為一個參數列表。如([param1,param2,param3] 轉換為 param1,param2,param3.
apply與call有更多的靈活用法,但是基於對基本文法的理解,更複雜的效果不難實現。歡迎有更多熱愛編程的小夥伴在評論區與我進行討論
js中的call()和apply()方法