上下文
在JavaScript中,你的代碼將總是有著某種形式的上下文(代碼在其內(nèi)部工作的對象)。這也是其它面向?qū)ο笳Z言所共有的功能,但它們都不如JavaScript處理得這樣極端。 上下文是通過變量this工作。變量this總是引用代碼當(dāng)前所在的那個對象。記住全局對象實際上是window對象的屬性。這意味著即使是在全局上下文里,this變量仍然引用一個對象。上下文可以成為一個強大的工具,是面向?qū)ο蟠a不可或缺的一環(huán)。程序2-17展示了一些關(guān)于上下文的簡單例子。 程序2-17. 在上下文中使用函數(shù)然后將其上下文切換到另一個變量的例子
var obj = { yes: function(){ // this == obj this.val = true; }, no: function(){ this.val = false; } };
//我們看到,obj對象沒有"val"的屬性 alert( obj.val == null );
//我們運行yes函數(shù),它將改變附著在obj對象的val屬性 obj.yes(); alert( obj.val == true );
//然而,我們現(xiàn)在讓window.no指向obj.no方法,并運行之 window.no = obj.no; window.no();
//這導(dǎo)致obj對象保持不變(上下文則切換到了window對象), alert( obj.val == true ); //而window的val屬性被更新 alert( window.val == false );
你可能已經(jīng)注意到,在程序2-17中,當(dāng)我們切換obj.no方法的上下文到變量window時,笨重的代碼需要切換函數(shù)的上下文。幸運的是,JavaScript提供了兩種方法使這一過程變得更加易于理解和實現(xiàn)。程序2-18展示了恰能些目的的兩種不同方法,call和apply。
程序2-18. 改變函數(shù)上下文的示例
//一個簡單的設(shè)置其上下文的顏色風(fēng)格的函數(shù) function changeColor( color ) { this.style.color = color; }
//在window對象上調(diào)用這個函數(shù)將會出錯,因為window沒有style對象 changeColor( "white" );
//得到一個id為"main"的對象 var main = document.getElementById("main");
//用call方法改變它的顏色為黑 //call方法將第一個參數(shù)設(shè)置為上下文, //并其它所有參數(shù)傳遞給函數(shù) changeColor.call( main, "black" );
//一個設(shè)置body元素的顏色的函數(shù) function setBodyColor() { //apply方法設(shè)置上下文為body元素 //第一個參數(shù)為設(shè)置的上下文, //第二個參數(shù)是一個被作為參數(shù)傳遞給函數(shù)的數(shù)組 // of arguments that gets passed to the function changeColor.apply( document.body, arguments ); }
//設(shè)置body元素的顏色為黑 setBodyColor( "black" );
上下文的有用性此處可能還沒有立即顯現(xiàn)。當(dāng)我們進入下一節(jié)"面向?qū)ο蟮腏avaScript"時,它會變得更加明顯。
出處:藍色理想
責(zé)任編輯:moby
上一頁 語言特性:閉包 下一頁 面向?qū)ο蠡A(chǔ)
◎進入論壇網(wǎng)頁制作、網(wǎng)站綜合版塊參加討論
|