<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Javascript - 全面理解 caller,callee,call,apply

    Posted on 2007-05-18 03:26 sunbaby 閱讀(133) 評論(0)  編輯  收藏 所屬分類: 其它

    1、caller

    JScript參考中說明為:返回一個對函數的引用,該函數調用了當前函數。如何理解這句話, 先來舉個簡單的例子:
    // caller demo {function callerDemo() {	if (callerDemo.caller) {		var a= callerDemo.caller.toString();		alert(a);	} else {		alert("this is a top function");	}}function handleCaller() {	callerDemo();}  
    上面的例子,可以看出,它就是返回一個調用數據的引用。(指向請求調用的函數) 也由此可以看出,當在這樣的情況下,onclick觸發事件的時候總是帶著匿名函數的
    function calleeDemo() {	alert(arguments.callee);}function calleeLengthDemo(arg1, arg2) {	if (arguments.length==arguments.callee.length) {		window.alert("驗證形參和實參長度正確!");		return;	} else {		alert("實參長度:" +arguments.length);		alert("形參長度: " +arguments.callee.length);	}}		
    從上面的例子可以看出,callee可以用來打在執行函數,也就是指向被調用的函數。上面的例子就說明calee可以打印其本身,當然還有其它的一些用途。而length屬性中arguments.length是實參長度,arguments.callee.length是形參長度,由此可以判斷調用時形參長度是否和實參長度一致。

    2、callee

    JScript參考中的說明為:返回正被執行的 Function 對象,也就是所指定的 Function 對象的正文。
    需要注意的是callee擁有length屬性,這個在有的時候用于驗證還是比較好的。

    3、call 和 apply

    call方法JScript參考中的說明:調用一個對象的一個方法,以另一個對象替換當前對象。call([thisObj[,arg1[, arg2[, [,.argN]]]]]),但是沒有示例
    apply方法JScript參考中的說明:應用某一對象的一個方法,用另一個對象替換當前對象。apply([thisObj[,argArray]])
    實際上這兩個的作用幾乎是相同的,要注意的地方是call(thisObj[,arg1[, arg2[,)中的arg參數可以是變量,而apply([thisObj[,argArray]])中的參數為數組集合。下面來看看call, apply的具體應用
    // simple call demofunction simpleCallDemo(arg) {	window.alert(arg);}function handleSPC(arg) {	simpleCallDemo.call(this, arg);}// simple apply demofunction simpleApplyDemo(arg) {	window.alert(arg);}function handleSPA(arg) {	simpleApplyDemo.apply(this, arguments);}	
    從上面簡單的例子可以看出,call和apply可以把當前的參數傳遞給另外一個函數的參數中,從而調用另一個函數的應用。有的時候這是一個很實用的方法,當然,用call或是apply(是參數或是數組),看實際情況而定了。

    下面來看另一個應用

    call和apply還有一個技巧在里面,就是用call和apply應用另一個函數(類)以后,當前的函數(類)就具備了另一個函數(類)的方法或者是屬性,這也可以稱之為“繼承”。看下面示例。
    // inheritfunction base() {	this.member = "never-online";	this.method = function() {		window.alert(this.member);	}}function extend() {	base.call(this);	window.alert(member);	window.alert(this.method);}	
    上面的例子可以看出,通過call之后,extend可以繼承到base的方法和屬性。

    再看一個apply的應用

    // advanced apply demofunction adApplyDemo(x) {	return ("this is never-online, BlueDestiny '" + x + "' demo");}function handleAdApplyDemo(obj, fname, before) {  var oldFunc = obj[fname];  obj[fname] = function() {    return oldFunc.apply(this, before(arguments));  };}function hellowordFunc(args) {  args[0] = "hello " + args[0];  return args;}function applyBefore() {	alert(adApplyDemo("world"));}function applyAfter() {	handleAdApplyDemo(this, "adApplyDemo", hellowordFunc);	alert(adApplyDemo("world")); // Hello world!}	
    需要注意的是,要先點"原始的adApplyDemo('world')"按鈕,如果先點"應用后的adApplyDemo('world')"按扭,會先應用了apply方法,這樣原始的值將會被改變。或許有的朋友沒有發現有什么特別的,我在這里指明一下,當點擊左邊的按扭時,只有"this is never-online, BlueDestiny 'world' demo", 當點擊右邊的按扭后,會現結果是"this is never-online, BlueDestiny 'hello world' demo",再點點左邊的按扭,看看結果又會是什么呢?自己試試看:D,已經改寫了函數adApplyDemo。這個例子則說明了call和apply的“真正”作用了。

    posts - 2, comments - 2, trackbacks - 0, articles - 25

    Copyright © sunbaby

    free web counter
    free web counter 點擊發送消息給我
    主站蜘蛛池模板: 国产亚洲精品不卡在线| 国产成人免费高清在线观看| 久久精品国产精品亚洲蜜月| 一本久久A久久免费精品不卡| 日本大片在线看黄a∨免费| 亚洲欧洲专线一区| 在线观看视频免费国语| 亚洲国产欧美日韩精品一区二区三区| 成年性生交大片免费看| 亚洲国产精品18久久久久久| 国产中文字幕免费观看| 国产免费区在线观看十分钟| 亚洲人JIZZ日本人| 四虎在线最新永久免费| 亚洲中文字幕无码av| 免费日韩在线视频| 丁香花在线观看免费观看图片 | 中文在线免费观看| 亚洲成在人天堂一区二区| 国产精品永久免费10000| 亚洲欧美日韩一区二区三区在线 | 毛片视频免费观看| 男女超爽视频免费播放| 九月丁香婷婷亚洲综合色| 99久久免费观看| 久久久久久精品免费看SSS| 亚洲一级视频在线观看| 在线日韩av永久免费观看| 黄桃AV无码免费一区二区三区| 亚洲视频精品在线观看| 国产成人免费永久播放视频平台| a级大片免费观看| 亚洲AV无码精品蜜桃| 亚洲精品黄色视频在线观看免费资源 | 久久久久亚洲Av无码专| 麻豆国产人免费人成免费视频 | 四虎影视永久免费观看地址| 99视频在线免费观看| 中文字幕 亚洲 有码 在线| 4444www免费看| 国产精品无码亚洲精品2021|