先說下區別 ,似乎除了參數之外沒什麼區別 apply第二個參數是一個數組
都是5.5的版本中出現的
言歸正傳
先看 call
文章的大概意思就是其 調用一個對象的一個方法,以另一個對象替換當前對象
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
thisObj 可選參數 將被用作當前對象的對象
arg1 , arg2,....
可選 將被傳遞方法序列
call方法可以用來代替另一個對象調用一個方法,call方法可將一個函數的對象上下文從初始的上下文改變爲thisObj指定的新對象
順便提一句如果沒有thisObj對象,那麼global對象就是thisObj對象
啥也不說了 來個例子就明白了
function add(a,b){
alert(a+b);
}
function sub(a,b){
alert(a-b);
}
add.call(sub,3,1);
你會發現運行的結果竟然是4 ,這是爲什麼呢?
其實就是add 替換了sub 然後 3 ,1 當做參數傳遞add 所以最後運行的結果就是4
在運行一下這個代碼
function add(){
this.name = "long";
this.sendName = function(){
alert(this.name)
}
}
var add = new add()
add.sendName()
然後在運行
function add(){
this.name = "long";
this.sendName = function(){
alert(this.name)
}
}
function addName (){
this.name = 'zhang';
}
var add = new add();
var addName = new addName();
add.sendName.call(addName)
這個意思是將add的sendName方法放在addName中執行 所以運行的結果就是zhang
重頭戲來了,call和apply用的最多的地方,,,,繼承
先來個簡單的例子方改變理解
function add(){
this.name = function(){
console.log("aaaa")
}
}
function send(){
add.call(this);
}
var send = new send();
send.name()
什麼?send怎麼會有name方法 。。。。?????
這就是使用call實現的繼承 add.call(this)的意思就是使用add對象來替代this對象,,而this指向的誰呢?所以send不就用了add的屬性和方法了嗎,,所以我們就很容易理解send調用add的方法是怎麼回事了。
function add(){
this.name = function(){
console.log("aaaa")
}
}
function send(){
this.send =function(){
console.log("bbb")
}
}
function end(){
add.call(this);
send.call(this)
}
var end = new end();
end.name();
end.send();
這個例子是實現多重繼承的。。怎麼樣很好理解吧????
說了這麼多的call ,apply存在感似乎有點低,現在說一個apply使用的話怎麼裝逼
var arr= [3,41,5,74,2];
alert(Math.max(arr))
function arrs(arr){
for(var i = 0 , arrar =arr[0] ; i < arr.length ; i++ ){
arrar = Math.max(arrar , arr[i])
}
return arrar;
}
arrs(arr)
function applyMax(arr){
return Math.max.apply(null,arr)
}
applyMax(arr)
然後再來一個push的數組
var arr= [3,41,5,74,2];
var arrLast = [1111,22222]
function arrar(arr,arrLast){
for(var i = 0 ; i < arrLast.length ; i++){
arr.push(arrLast[i])
}
return arr;
}
arrar(arr,arrLast)
這似乎是一種常見的寫法,,要是就這麼結束了,那不是打臉啊。。。
var arr= [3,41,5,74,2];
var arrLast = [1111,22222]
function arrar(arr,arrLast){
Array.prototype.push.apply(arr,arrLast)
return arr
}
arrar(arr,arrLast)
最後運行一下這段代碼,,
對於我們前端來說框架只不過是一種工具,但是基礎確實我們在市場上存活的唯一法寶,,加油。。。。。