Javascript中的call()方法介紹
在Mozilla的官網(wǎng)中對于call()的介紹是:
call() 方法在使用一個指定的this值和若干個指定的參數(shù)值的前提下調(diào)用某個函數(shù)或方法.
Call() 語法
fun.call(thisArg[, arg1[, arg2[, ...]]])
Call() 參數(shù)
thisArg
在fun函數(shù)運行時指定的this值。需要注意的是,指定的this值并不一定是該函數(shù)執(zhí)行時真正的this值,如果這個函數(shù)處于非嚴格模式下,則指定為null和undefined的this值會自動指向全局對象(瀏覽器中就是window對象),同時值為原始值(數(shù)字,字符串,布爾值)的this會指向該原始值的自動包裝對象。
arg1, arg2, ...
指定的參數(shù)列表。
Javascript中的call()方法
先不關(guān)注上面那些復(fù)雜的解釋,一步步地開始這個過程。
Call()方法的實例
于是寫了另外一個Hello,World:
function print(p1, p2) {
console.log( p1 + ' ' + p2);
}
print("Hello", "World");
print.call(undefined, "Hello", "World");
兩種方式有同樣的輸出結(jié)果,然而,相比之下call方法還傳進了一個undefined。
接著,我們再來看另外一個例子。
var obj=function(){};
function print(p1, p2) {
console.log( p1 + ' ' + p2);
}
print.call(obj, "Hello", "World");
只是在這里,我們傳進去的還是一個undefined,因為上一個例子中的undefined是因為需要傳進一個參數(shù)。這里并沒有真正體現(xiàn)call的用法,看看一個更好的例子。
function print(name) {
console.log( this.p1 + ' ' + this.p2);
}
var h={p1:"hello", p2:"world", print:print};
h.print("fd");
var h2={p1:"hello", p2:"world"};
print.call(h2, "nothing");
call就用就是借用別人的方法、對象來調(diào)用,就像調(diào)用自己的一樣。在h.print,當將函數(shù)作為方法調(diào)用時,this將指向相關(guān)的對象。只是在這個例子中我們沒有看明白,到底是h2調(diào)了print,還是print調(diào)用了h2。于是引用了Mozilla的例子
function Product(name, price) {
this.name = name;
this.price = price;
if (price < 0)
throw RangeError('Cannot create product "' + name + '" with a negative price');
return this;
}
function Food(name, price) {
Product.call(this, name, price);
this.category = 'food';
}
Food.prototype = new Product();
var cheese = new Food('feta', 5);
console.log(cheese);
在這里我們可以真正地看明白,到底是哪個對象調(diào)用了哪個方法。例子中,使用Food構(gòu)造函數(shù)創(chuàng)建的對象實例都會擁有在Product構(gòu)造函數(shù)中添加的 name 屬性和 price 屬性,但 category 屬性是在各自的構(gòu)造函數(shù)中定義的。
function print(name) {
console.log( this.p1 + ' ' + this.p2);
}
var h2= function(no){
this.p1 = "hello";
this.p2 = "world";
print.call(this, "nothing");
};
h2();
這里的h2作為一個接收者來調(diào)用函數(shù)print。正如在Food例子中,在一個子構(gòu)造函數(shù)中,你可以通過調(diào)用父構(gòu)造函數(shù)的 call 方法來實現(xiàn)繼承。
至于Call方法優(yōu)點,在《Effective JavaScript》中有介紹。
1.使用call方法自定義接收者來調(diào)用函數(shù)。
2.使用call方法可以調(diào)用在給定的對象中不存在的方法。
3.使用call方法可以定義高階函數(shù)允許使用者給回調(diào)函數(shù)指定接收者。
- 小議Function.apply()之二------利用Apply的參數(shù)數(shù)組化來提高 JavaScript程序性能
- 關(guān)于javascript 回調(diào)函數(shù)中變量作用域的討論
- JavaScript中的apply()方法和call()方法使用介紹
- 基于JavaScript實現(xiàn)繼承機制之調(diào)用call()與apply()的方法詳解
- JavaScript回調(diào)(callback)函數(shù)概念自我理解及示例
- JavaScript中的prototype.bind()方法介紹
- 理解javascript回調(diào)函數(shù)
- javascript判斷css3動畫結(jié)束 css3動畫結(jié)束的回調(diào)函數(shù)
- Javascript中的apply()方法淺析
- 淺談javascript中call()、apply()、bind()的用法
- 跟我學(xué)習(xí)javascript的call(),apply(),bind()與回調(diào)
相關(guān)文章
Web技術(shù)實現(xiàn)移動監(jiān)測的介紹
移動偵測,一般也叫運動檢測,常用于無人值守監(jiān)控錄像和自動報警。通過攝像頭按照不同幀率采集得到的圖像會被 CPU 按照一定算法進行計算和比較,當畫面有變化時,如有人走過,鏡頭被移動,計算比較結(jié)果得出的數(shù)字會超過閾值并指示系統(tǒng)能自動作出相應(yīng)的處理2017-09-09
JavaScript做大整數(shù)加法計算的代碼實現(xiàn)
這篇文章主要帶大家去了解前端如何做大整數(shù)加法計算,文中通過代碼示例介紹的非常詳細,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-09-09
javascript數(shù)字數(shù)組去重復(fù)項的實現(xiàn)代碼
console.log 不支持ie,下面的代碼需要在火狐中測試,不然會有問題。2010-12-12
淺析Javascript ES6新增值比較函數(shù)Object.is
在Javascript中判斷相等是很常見的,常用的判斷有“==”,“===”,“!=”,“!==”,今天這篇文章我們來學(xué)習(xí)ES6中的一個方法Object.is(),有需要的可以參考學(xué)習(xí)。2016-08-08
使用json對象轉(zhuǎn)化為key,value的對象數(shù)組
這篇文章主要介紹了使用json對象轉(zhuǎn)化為key,value的對象數(shù)組方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06

