javascript 面向?qū)ο缶幊?nbsp; function是方法(函數(shù))
javascript中的function可以用來(lái)創(chuàng)建方法、也可以用來(lái)創(chuàng)建類,實(shí)際上我們可以認(rèn)為是用function來(lái)模擬出的類(說(shuō)到類一般都會(huì)要去了解閉包的知識(shí))。還是先看一下方法吧。
javascript函數(shù)分為有名函數(shù)、匿名函數(shù)和在匿名函數(shù)基礎(chǔ)上延伸出來(lái)的立即執(zhí)行函數(shù)。
普通函數(shù)就是用function直接聲明的有名函數(shù)。
function Hello() { alert("hello , everybody!");};
Hello();
function SayHelloTo(somebody) {alert("hello , " + somebody + "!");
};
SayHelloTo("張三");上面分別創(chuàng)建了Hello和SayHelloTo方法。Hello不帶有參數(shù),直接通過(guò)Hello()來(lái)完成調(diào)用。SayHelloTo方法帶有一個(gè)參數(shù),向誰(shuí)問(wèn)候時(shí)需要知道是在問(wèn)候誰(shuí)。在調(diào)用SayHelloTo(“張三”)時(shí)要傳入?yún)?shù)。這些代碼和java、C#都沒(méi)有什么太大區(qū)別。在方法重載上卻有較大改變,javascript本身并不支持什么重載,一個(gè)方法名就對(duì)應(yīng)一個(gè)方法。如果強(qiáng)制的寫出多個(gè)同名方法,其實(shí)會(huì)出現(xiàn)先寫的方法被覆蓋掉的情況。
function Hello() { alert("hello , everybody!");};
Hello();
function Hello(somebody) {alert("hello , " + somebody + "!");
};
Hello("張三");
第一個(gè)Hello方法被覆蓋掉,執(zhí)行時(shí)直接調(diào)用Hello()則認(rèn)為調(diào)用第二個(gè)Hello方法但沒(méi)有傳遞參數(shù)值,所以彈出了undefined信息。調(diào)用Hello(“張三”)時(shí)很正常的完成執(zhí)行。其實(shí)javascript也可以用一些直白的方式來(lái)完成重載。學(xué)過(guò)C#的人都會(huì)知道有個(gè)params關(guān)鍵字,通過(guò)它可以實(shí)現(xiàn)向方法傳遞不定個(gè)數(shù)的參數(shù)。我們可以通過(guò)對(duì)參數(shù)的信息做手動(dòng)的判斷也可以模擬出類似重載的效果。而在javascript中根本就不需要什么params關(guān)鍵字,就可以很自然的實(shí)現(xiàn)任意個(gè)數(shù)參數(shù)的傳遞。function中有個(gè)arguments屬性,可以把它看成一個(gè)數(shù)組,它按傳遞進(jìn)來(lái)的參數(shù)的順序來(lái)保存所有的參數(shù)。也就是說(shuō)我們?cè)诙x方法時(shí)可以不聲明參數(shù)名。
function ShowArguments() {var args = "";
for (var i = 0; i < arguments.length; i++) {
args += arguments[i] + ",";};
alert(args.substr(0, args.length - 1));
};
ShowArguments(1, 2, 3, 4, 5, 6, 7);
function Hello() { if (arguments.length == 0) { alert("hello , everybody!");}
else {alert("hello , " + arguments[0] + "!");
};
};
Hello();
Hello("張三");基于參數(shù)個(gè)數(shù)不同的重載。
function Increase(arg) {if (typeof arg == "undefined") {
alert("請(qǐng)輸入?yún)?shù)");}
if (typeof arg == "string") {
alert(String.fromCharCode(arg.charCodeAt(0) + 1));
}
if (typeof arg == "number") {
alert(arg + 1);
}
};
Increase();
Increase("a");Increase(1);
函數(shù)除了有名函數(shù)之外也可以是匿名函數(shù),匿名函數(shù)就是沒(méi)有名子的函數(shù),不論函數(shù)有名還是沒(méi)有名子,都是一個(gè)完整的函數(shù)對(duì)象。匿名函數(shù)還是用function來(lái)聲明,但不用為它指定名稱。其它的方面,比如參數(shù)等等和有名函數(shù)沒(méi)什么區(qū)別。
function() {……
};
匿名函數(shù)一般可以滿足臨時(shí)的函數(shù)需求,不需要有變量對(duì)其進(jìn)行引用(有名的函數(shù)可以認(rèn)為是有變量引用的函數(shù))。比如需要一個(gè)函數(shù)做為值對(duì)象做為參數(shù)傳入方法、需要編程的方式為對(duì)象添加事件,用匿名函數(shù)都可以很好的完成。當(dāng)然你也可以單獨(dú)聲明變量來(lái)引用某個(gè)匿名函數(shù)對(duì)象,這和普通有名函數(shù)就沒(méi)什么區(qū)別了。
function Each(array, fun) {for (var i = 0; i < array.length; i++) {
fun(array[i]);
};
};
var nums = [1, 2, 3, 4, 5, 6, 7]; Each(nums, function(arg) {alert(arg);
});
上面代碼執(zhí)行,依次輸出數(shù)組中的元素。
//在窗體加載時(shí),在標(biāo)題上顯示當(dāng)前時(shí)間 window.onload = function() { document.title = new Date().toString();};
//也可以將匿名方法傳入定時(shí)器中 setInterval(function() { document.title = new Date().toString();}, 1000);
使用匿名函數(shù)綁定事件和進(jìn)行定時(shí)操作。
var Hello = function() {
alert("hello , everybody!");};
如果將匿名函數(shù)賦給變量,那和有名的普通函數(shù)就沒(méi)區(qū)別了。但不管是變量引用還是普通地有名函數(shù),這樣的函數(shù)在內(nèi)存上都持久的占有一定資源。有時(shí)候我們只想執(zhí)行一次大不必使用有引用的函數(shù),直接執(zhí)行匿名函數(shù)可能是最好的選擇。把匿名函數(shù)包起來(lái),加個(gè)括號(hào)執(zhí)行,一切ok,這就是由匿名函數(shù)延伸出來(lái)的立即執(zhí)行函數(shù)。
(function() { alert("hello , everybody!");})();
(function(somebody) {alert("hello , " + somebody + "!");
})("張三");立即執(zhí)行函數(shù)在做事件綁定,設(shè)置回調(diào)函數(shù)等方面往往會(huì)有意想不到的效果,可以解決諸如對(duì)象引用等問(wèn)題。
var student = { Name: "張三",Age: 20,
Introduce: function() {alert("我叫" + this.Name + ",今年" + this.Age + "歲了!");
} };
window.onload = (function(obj) { return function() { obj.Introduce(); }; })(student);
因?yàn)閖avascript中函數(shù)的這些特點(diǎn)加之它的對(duì)象的特征,我們還可以寫出一些有functional意味的程序出來(lái)。其實(shí)javascript中function真的是老大。
function Sum(fun, x) { if (x <= 0) return 0; return fun(x) + Sum(fun, x - 1);};
alert(Sum(function(i) { return i * i; }, 100));
下面這又是什么呢?是方法嗎?是類嗎?
function Point() {};
先啰嗦到這,下次再看看類。
相關(guān)文章
JS小框架 fly javascript framework
這幾天把工作中積累的東西整理成了一個(gè)小框架,分享給大家,希望對(duì)大家有用,也想聽(tīng)一下大家的批評(píng)2009-11-11
學(xué)習(xí)JS面向?qū)ο蟪晒?借國(guó)慶發(fā)布個(gè)最新作品與大家交流
學(xué)習(xí)JS面向?qū)ο蟪晒?,借?guó)慶發(fā)布個(gè)最新作品與大家交流,大家可以看下。2009-10-10
javascript中的對(duì)象創(chuàng)建 實(shí)例附注釋
為了讓你的js代碼更加的專業(yè)與代碼的條理性,很多情況下都是定義成對(duì)象的方式來(lái)書寫代碼,想深入的朋友可以參考下。2011-02-02
DOMAssitant最新版 DOMAssistant 2.5發(fā)布
google code上的project ,值得大家學(xué)習(xí)它的類庫(kù)2007-12-12
javascript 面向?qū)ο缶幊?function也是類
function在javascript中用來(lái)創(chuàng)建函數(shù)或方法,但要想實(shí)現(xiàn)面向?qū)ο蠓绞降木幊?,類是不可或缺的角色之一,而且是主角?/div> 2009-09-09
JavaScript 面向?qū)ο缶幊蹋?) 基礎(chǔ)
自從有了Ajax這個(gè)概念,JavaScript作為Ajax的利器,其作用一路飆升。JavaScript最基本的使用,以及語(yǔ)法、瀏覽器對(duì)象等等東東在這里就不累贅了。把主要篇幅放在如何實(shí)現(xiàn)JavaScript的面向?qū)ο缶幊谭矫妗?/div> 2010-05-05
JavaScript 常見(jiàn)對(duì)象類創(chuàng)建代碼與優(yōu)缺點(diǎn)分析
這幾種javascript類定義方式中,最常用的是雜合prototype/constructor 和 動(dòng)態(tài)prototype方式。2009-12-12最新評(píng)論
大家感興趣的內(nèi)容
- 1JavaScript 三種創(chuàng)建對(duì)象的方法
- 2JS 創(chuàng)建對(duì)象(常見(jiàn)的幾種方法)
- 3JS類的封裝及實(shí)現(xiàn)代碼
- 4詳解new function(){}和function(){
- 5javascript復(fù)制對(duì)象使用說(shuō)明
- 6js創(chuàng)建對(duì)象的幾種常用方式小結(jié)(推薦)
- 7Javascript 面向?qū)ο螅ㄒ唬?共有方法,私有方法,特
- 8改變javascript函數(shù)內(nèi)部this指針指向的三種方法
- 9Javascript Object.extend
- 10JavaScript定義類或函數(shù)的幾種方式小結(jié)
最近更新的內(nèi)容
- javascript 寫類方式之六
- js創(chuàng)建對(duì)象的幾種常用方式小結(jié)(推薦)
- 一實(shí)用的實(shí)現(xiàn)table排序的Javascript類庫(kù)
- JavaScript面向?qū)ο?極簡(jiǎn)主義法minimalist approac
- JavaScript 對(duì)象鏈?zhǔn)讲僮鳒y(cè)試代碼
- 手把手教你自己寫一個(gè)js表單驗(yàn)證框架的方法
- js定義對(duì)象簡(jiǎn)單學(xué)習(xí)例子
- javascript復(fù)制對(duì)象使用說(shuō)明
- javascript 單例模式演示代碼 javascript面向?qū)ο缶幊?/a>
- mapper--圖片熱點(diǎn)區(qū)域高亮組件官方站點(diǎn)


