js函數(shù)
一、function概述
javascript中的函數(shù)不同于其他的語言,每個(gè)函數(shù)都是作為一個(gè)對(duì)象被維護(hù)和運(yùn)行的。通過函數(shù)對(duì)象的性質(zhì),可以很方便的將一個(gè)函數(shù)賦值給一個(gè)變量或者將函數(shù)作為參數(shù)傳遞。
函數(shù)對(duì)象與其他用戶所定義的對(duì)象有著本質(zhì)的區(qū)別,這一類對(duì)象被稱之為內(nèi)部對(duì)象。內(nèi)置對(duì)象的構(gòu)造器是由JavaScript本身所定義的。
二、function對(duì)象的創(chuàng)建
在JavaScript中,函數(shù)對(duì)象對(duì)應(yīng)的類型是Function,可以通過new Function()來創(chuàng)建一個(gè)函數(shù)對(duì)象,也可以通過function關(guān)鍵字來創(chuàng)建一個(gè)對(duì)象。
//使用new Function()方式創(chuàng)建
var myFunction=new Function("a","b","return a+b");
//使用function關(guān)鍵字創(chuàng)建
function myFunction(a,b) {
return a + b;
}
用關(guān)鍵字創(chuàng)建對(duì)象的時(shí)候,在解釋器內(nèi)部,就會(huì)自動(dòng)構(gòu)造一個(gè)Function對(duì)象,將函數(shù)作為一個(gè)內(nèi)部的對(duì)象來存儲(chǔ)和運(yùn)行。從這里也可以看到,一個(gè)函數(shù)對(duì)象 名稱(函數(shù)變量)和一個(gè)普通變量名稱具有同樣的規(guī)范,都可以通過變量名來引用這個(gè)變量,但是函數(shù)變量名后面可以跟上括號(hào)和參數(shù)列表來進(jìn)行函數(shù)調(diào)用。
new Function()的語法規(guī)范如下:
var funcName=new Function(p1,p2,...,pn,body);
參數(shù)的類型都是字符串,p1到pn表示所創(chuàng)建函數(shù)的參數(shù)名稱列表,body表示所創(chuàng)建函數(shù)的函數(shù)體語句,funcName就是所創(chuàng)建函數(shù)的名稱。可以不指定任何參數(shù)創(chuàng)建一個(gè)空函數(shù),不指定funcName創(chuàng)建一個(gè)匿名函數(shù)。
需要注意的是,p1到pn是參數(shù)名稱的列表,即p1不僅能代表一個(gè)參數(shù),它也可以是一個(gè)逗號(hào)隔開的參數(shù)列表,例如下面的定義是等價(jià)的:
new Function("a", "b", "c", "return a+b+c")
new Function("a, b, c", "return a+b+c")
new Function("a,b", "c", "return a+b+c")
函數(shù)的本質(zhì)是一個(gè)內(nèi)部對(duì)象,由JavaScript解釋器決定其運(yùn)行方式。并且可直接在函數(shù)聲明后面加上括號(hào)就表示創(chuàng)建完成后立即進(jìn)行函數(shù)調(diào)用,例如:
var i=function (a,b){
return a+b;
}(1,2);
alert(i);
這段代碼會(huì)顯示變量i的值等于3。i是表示返回的值,而不是創(chuàng)建的函數(shù),因?yàn)槔ㄌ?hào)“(”比等號(hào)“=”有更高的優(yōu)先級(jí)。
三、匿名函數(shù)和有名函數(shù)的區(qū)別
匿名函數(shù)必須先定義后調(diào)用,有名函數(shù)可以先調(diào)用,后定義。
A)匿名(這段語句將產(chǎn)生func未定義的錯(cuò)誤)
<script>
func();
var func = function() {
alert(1);
}
< /script>
B)有名(輸出1)
<script>
func();
function func() {
alert(1);
}
< /script>
這是因?yàn)镴S解釋器是分段分析執(zhí)行的。并且,在同一段中,有名函數(shù)會(huì)優(yōu)先被分析。并且同名函數(shù)后面的覆蓋前面的。
而且,下面這段代碼也是合法的:
<script>
function myfunc ()
{
alert("hello");
};
myfunc(); //這里調(diào)用myfunc,輸出yeah而不是hello
function myfunc ()
{
alert("yeah");
};
myfunc(); //這里調(diào)用myfunc,輸出yeah
</script>
如果要讓上述代碼的第一次調(diào)用輸出“hello”,可以將它們分為兩段:
<script>
function myfunc ()
{
alert("hello");
};
myfunc(); //這里調(diào)用myfunc,輸出hello
< /script>
<script>
function myfunc ()
{
alert("yeah");
};
myfunc(); //這里調(diào)用myfunc,輸出yeah
</script>
下面的代碼輸出“hello”
<script>
function myfunc ()
{
alert("hello");
};
< /script>
<script>
myfunc(); //輸出“hello”
</script>
<script>
function myfunc ()
{
alert("yeah");
};
</script>
下面的代碼輸出“yeah”
<script>
function myfunc ()
{
alert("hello");
};
< /script>
<script>
function myfunc ()
{
alert("yeah");
};
</script>
<script>
myfunc(); //輸出“yeah”
</script>
從上面對(duì)段的位置變化導(dǎo)致輸出變化很清楚的解釋了JS解釋器分段分析執(zhí)行的本質(zhì)。
posted on 2013-01-18 13:11 楊軍威 閱讀(205) 評(píng)論(0) 編輯 收藏