看js的資料,隨手記下一些認為實用的東東,以饗和我一樣正在學習的諸位看官。
“JavaScript 為函數對象定義了兩個方法:apply 和call,它們的作用都是將函數綁定到另外一個對象上去運行,兩者僅在定義參數的方式有所區別:
Function.prototype.apply(thisArg,argArray); Function.prototype.call(thisArg[,arg1[,arg2…]]); 從函數原型可以看到,第一個參數都被取名為thisArg,也就是說,所有函數內部的this 指標都會被賦值為thisArg,這就達到了將函數作為另外一個對象的方法啟動並執行目的。兩個方法除了thisArg 參數,都是為Function 對象傳遞的參數。下面的代碼說明了apply 和call 方法的工作方式:"(上面這段抄自<<征服ajax>>電子書,如有著作權糾紛,請聯絡電子書作者,與本人無關)
Code
function myFuncOne() {
this.p = "myFuncOne-";
this.A = function(arg) {
alert(this.p + arg);
}
}
function myFuncTwo() {
this.p = "myFuncTwo-";
this.B = function(arg) {
alert(this.p + arg);
}
}
function test() {
var obj1 = new myFuncOne();
var obj2 = new myFuncTwo();
obj1.A("testA"); //顯示myFuncOne-testA
obj2.B("testB"); //顯示myFuncTwo-testB
obj1.A.apply(obj2, ["testA"]); //顯示myFuncTwo-testA,其中[ testA”]是僅有一個元素的數組
obj2.B.apply(obj1, ["testB"]); //顯示myFuncOne-testB,其中[ testB”]是僅有一個元素的數組
obj1.A.call(obj2, "testA"); //顯示myFuncTwo-testA
obj2.B.call(obj1, "testB"); //顯示myFuncOne-testB
}
代碼是廉價的(Code is cheap),拷貝粘貼試一下,本人機器運行通過。
函數對象還有一個與參數相關的屬性length,這裡看清楚了,是與“參數”相關的屬性,沒錯,字面理解,就是參數個數,不說了,看代碼:
Code
function fun1(a, b, c) {
}
function fun2(a, b) {
}
function fun3() {
}
function test() {
for (var i = 1; i < 4; i++) {
var len = eval(("fun" + i) + ".length");
alert(len);
}
// alert(fun1.length);
// alert(fun2.length);
// alert(fun3.length);
}
與length屬性不同,js有一個傳遞給函數的隱含參數,arguments,它也有一個length屬性,下篇細說從頭,洗洗睡了。