項(xiàng)目中經(jīng)常使用createDelegate()方法來創(chuàng)建代理函數(shù),從而改變當(dāng)前函數(shù)中this的作用域.看下了源碼,發(fā)現(xiàn)是通過js中的apply()方法來實(shí)現(xiàn),想想也只能通過apply()或者call()方法來實(shí)現(xiàn),因?yàn)閖s中只有這2個(gè)方法提供了改變當(dāng)前函數(shù)內(nèi)部this作用域的功能.此外,Ext中很多地方用到了call()和apply()方法,要想看懂源碼,則必須先搞清這2個(gè)方法的用法.
createDelegate方法聲明為:
1
createDelegate : function(obj, args, appendArgs)
{
2
var method = this;
3
return function()
{
4
var callArgs = args || arguments;
5
if(appendArgs === true)
{
6
callArgs = Array.prototype.slice.call(arguments, 0);
7
callArgs = callArgs.concat(args);
8
}else if(typeof appendArgs == "number")
{
9
callArgs = Array.prototype.slice.call(arguments, 0); // copy arguments first
10
var applyArgs = [appendArgs, 0].concat(args); // create method call params
11
Array.prototype.splice.apply(callArgs, applyArgs); // splice them in
12
}
13
return method.apply(obj || window, callArgs);
14
};
15
},
其中obj表示函數(shù)內(nèi)部this作用域的范圍,args是數(shù)組,appendArgs是"Boolean或Number",如果appendArgs是Boolean型的且值為true,那么args參數(shù)將跟在調(diào)用代理方法時(shí)傳入的參數(shù)后面組成數(shù)組一起傳入當(dāng)前方法,否則只傳入args,如果appendArgs為Number型,那么args將插入到appendArgs指定的位置.
注意點(diǎn):
1.函數(shù)內(nèi)部的arguments關(guān)鍵字是函數(shù)執(zhí)行時(shí)動態(tài)創(chuàng)建的,用來存儲調(diào)用函數(shù)時(shí)所傳入?yún)?shù).這里第4行的arguments 并不指調(diào)用createDelegate方法所傳入的參數(shù)(obj,args,appendArgs),而是指調(diào)用return function()時(shí)所傳入的參數(shù),即調(diào)用代理函數(shù)時(shí)所傳入的參數(shù).而args和appendArgs就是調(diào)用createDelegate方法時(shí)所傳入的參數(shù).總的來說,函數(shù)是在定義它的作用域中執(zhí)行,而不是在調(diào)用它的作用域中執(zhí)行.但也有特殊,比如這里的arguments.
2.call和apply的區(qū)別.
二者的第一個(gè)參數(shù)都是函數(shù)內(nèi)部this的作用域,call的參數(shù)只能作為一串參數(shù)傳入,而apply可以傳入數(shù)組或arguments對象.如
fun.call(window,args0,args1,.....);
fun.apply(window,[1,2,3]);
但要注意的是apply方法傳遞到函數(shù)內(nèi)部的參數(shù)實(shí)際也是作為一個(gè)個(gè)參數(shù)傳遞的.如果在fun內(nèi)部測試arguments.length的話,則長度為3.同樣,我們可以采用arguments[0],arguments[1],arguments[2]來分別引用1,2,3三個(gè)參數(shù),而不是用arguments[0][0],arguments[0][1],arguments[0][2]來引用3個(gè)參數(shù).這樣才能解釋11行的代碼.
posted on 2008-04-30 17:11
zhangchao 閱讀(2677)
評論(0) 編輯 收藏 所屬分類:
Ext