您好,登錄后才能下訂單哦!
小編這次要給大家分享的是JavaScript直接調用函數(shù)與call調用有什么區(qū)別,文章內容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。
直接調用
直接調用函數(shù)是最常見最普通的方式,直接以函數(shù)附加的對象作為調用者, 在函數(shù)后括號內傳入?yún)?shù)來調用函數(shù)
例如:
window.alert("測試代碼");
其中調用者如果是window可以省略, 即直接alert("測試代碼");
語法:call([thisObject[,arg1 [,arg2 [,...,argn]]]]);
新同學看來好像直接調用就夠了, 其實不然, 直接調用函數(shù)方式簡單易用但不夠靈活, 有些時候調用函數(shù)時需要動態(tài)地傳入一個函數(shù)的引用,此時為了動態(tài)地調用函數(shù),就需要使用call方法來調用了
舉個例子:
<script type="text/javascript"> var each =function(array,fn) { for(var index in array) { fn.call(null,index,array[index]); } } each([4,20,3],function (index,ele) { document.write("第"+index+"個元素是"+ele+"<br/>"); } ); </script>
乍看可能比較暈, 注意fn.call語句, call調用的格式是在參數(shù)第一個填調用者,后邊按順序輸入?yún)?shù), 參數(shù)形式比較特別, 與直接調用不同,調用者不寫在前面, 而是參數(shù)第一項. 格式: fn.call(obj,args);
看到這里大家應該會有疑問, call到底和直接調用有什么區(qū)別, 區(qū)別就在于call調用修改了this指針的指向, 如果被調用的函數(shù)里壓根沒用到this也就沒有什么區(qū)別了
再舉一個被調用函數(shù)有this指針的例子:
var x = "我是全局變量"; //定義全局變量x function a(){ //定義函數(shù)類結構a this.x = "我是在函數(shù)類結構a中聲明的哦"; } //定義普通函數(shù),彈出當前指針所包含的變量x的值 function f(){ alert (this.x); } //返回值為“我是在函數(shù)類結構a中聲明的哦” f.call(new a());
我的理解是,f.call(new a())就是把函數(shù)(其實也是對象)f復制到被調用對象“new a()”下面去解析,事實上和下面這段代碼的解析結果一樣:
function a(){ this.x = "我是在函數(shù)類結構a中聲明的哦"; alert(this.x); } a();
事實上,是在調用f.call()的時候,修改了f()中的this指向。本來,f中的this.a,this.b屬性都是自身的,但是通過f.call()調用時,傳入了一個新的對象e()(this),這樣,將e綁定到了f的this中,本來是給f增加的屬性,加到了e中。(e與e(),f與f()都是等價的)有點類似于“繼承”,但是這個應該叫 JS中對象冒充
apply() 方法與call()方法的功能節(jié)本相似 ,都可以用來動態(tài)地調用函數(shù). apply()與call()的區(qū)別如下:
語法:apply([thisObj [,argArray] ]);
比如下面的兩個語句是相等的:
myfun.call(window,12,13); myfun.capply(window,[12,13]);
在修改this指針這點上,apply()與call()也保持一致,
大體上來說apply()與call()只在傳參形式上有些差別而已.
看完這篇關于JavaScript直接調用函數(shù)與call調用有什么區(qū)別的文章,如果覺得文章內容寫得不錯的話,可以把它分享出去給更多人看到。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。