激情欧美日韩一区二区|国产18在线播放|黄的日本免费大片|国产色在线 | 亚洲|青青操夜夜操

Javascript中函數天生具有的兩個方法

歡歡歡歡 發表于 2014-5-11 03:14

Javascript的函數有兩個共同的方法:apply()call()。兩個方法的目的是一樣的,只是在具體用法有所區別。

這兩個方法都調用了函數,并且第一個參數指定了函數體中this所代表的對象。

區別在于apply()的第二個參數是函數調用時的參數,可以是一個數組也可以是一個arguments對象。

 

例子:

function sum(num1, num2){

return num1 + num2;

}

function callSum1(num1, num2){

return sum.apply(this, arguments); //passing in arguments object

}

function callSum2(num1, num2){

return sum.apply(this, [num1, num2]); //passing in array

}

alert(callSum1(10,10)); //20

alert(callSum2(10,10)); //20

 

上面的例子中,callSum1使用了arguments作為第二個參數。callSum2使用了一個數組作為參數參數,這兩種使用方法都是有效的。另外,兩個函數中的this實際上指向了window對象,因為這兩個函數都是在全局中被調用的。

call()的用法和apply()相似,只是在傳參的有不同。它的第一個參數還是this,但是剩下的參數會被直接傳入參數。也就是說,apply()只會有兩個參數,而call()可以有N個參數。

 

例子:

function sum(num1, num2){

return num1 + num2;

}

function callSum(num1, num2){

return sum.call(this, num1, num2);

}

alert(callSum(10,10)); //20

為了達到和最上面的兩個方法(callSum1和callSum2)一樣的效果,callSum必須將自己的每個參數都傳遞進call()中作為參數。

具體使用call()還是apply()要取決于具體情況。如果只傳第一個參數,call()apply()的效果是一樣的。

 

上面介紹了call()apply()的基本用法,下面來說說他們真正強大的地方。

它們真正強大的地方不在于它們傳遞參數的能力,而在于它們增強了函數體中this的能力。

看下面這個例子:

window.color = “red”;

var o = { color: “blue” };

function sayColor(){

alert(this.color);

}

sayColor(); //red

sayColor.call(this); //red

sayColor.call(window); //red

sayColor.call(o); //blue

sayColor()函數體中使用了this這個關鍵詞,當它在全局范圍被單獨調用的時候,這個this指的就是window,但是當它通過call()方法被調用的時候,這個this指的就是call()中的第一個參數,因此,當call()中的第一個參數不一樣的時候,函數體中this所指向的對象就不一樣,造成的結果也就不一樣,因此增強了函數的使用方式和開發者的遐想空間。