js中的函數(shù)學習(一)
1.函數(shù)
注意:定義函數(shù)時可以使用個數(shù)可變的參數(shù),而且函數(shù)既可以有return語句,也可以沒有return語句;如果函數(shù)不包含return語句,它就只執(zhí)行函數(shù)體中的每條語句,然后返回給調(diào)用者undefined。
使用運算符typeof來檢測參數(shù)的數(shù)據(jù)類型,使用if(!param)return;來判斷是否存在該參數(shù),因為js是一種無類型語言,所以你不能給函數(shù)的參數(shù)制定一個數(shù)據(jù)類型,而且js也不會檢測傳遞的數(shù)據(jù)是不是那個函數(shù)所需要的類型,如果參數(shù)很重要時,就使用前面介紹的運算符進行檢測。
不可變參數(shù)js的處理:如果傳遞的參數(shù)比函數(shù)需要的個數(shù)多,那么多余的幾個參數(shù)被忽略掉,如果傳遞的參數(shù)比函數(shù)需要的個數(shù)少,那么多余的幾個參數(shù)就會被賦予undefined,在大多數(shù)情況下,這回使得函數(shù)產(chǎn)生錯誤。
2.嵌套函數(shù)
a,函數(shù)定義中可以嵌套其他函數(shù)的定義,但是只能在在頂層全局代碼和頂層函數(shù)代碼中,不能出現(xiàn)在循環(huán)或條件語句中,并且這些限制只應用于由function語句聲明的函數(shù),函數(shù)直接量可以出現(xiàn)在任何js表達式中。
3.Function()構(gòu)造函數(shù)
可以使用Function()構(gòu)造函數(shù)和new運算符動態(tài)地定義函數(shù), var f = new Function("x","y","return x*y;");它等價于:function f(x,y){return x*y;}
Function構(gòu)造函數(shù)可以接受任意多個字符串參數(shù),它的最后一個參數(shù)是函數(shù)的主體,其中可以包含任何js語句,語句之間用分號分隔。由于傳遞給構(gòu)造函數(shù)Function()的參數(shù)中沒有一個用于說明它要創(chuàng)建的函數(shù)名,用Function()構(gòu)造函數(shù)創(chuàng)建的未命名函數(shù)有時被稱作為“匿名函數(shù)”。
Function()函數(shù)存在的意義:因為Function()構(gòu)造函數(shù)允許我們動態(tài)地建立和編譯一個函數(shù),它不會將我們限制在function語句預編譯的函數(shù)體中;另一個原因是它能將函數(shù)定義為js表達式的一部分,而不是將其定義為一個語句;缺點是:這樣做每次調(diào)用一個函數(shù)時,F(xiàn)unction()構(gòu)造函數(shù)都要對它進行編譯,
4.函數(shù)直接量
函數(shù)直接量是一個表達式,它可以定義匿名函數(shù)。
function f(x){return x*x;} //function語句
var f = new Function("x","return x*x;"); //Function()構(gòu)造函數(shù)
var f = function(X){return x*x;}; //函數(shù)直接量
雖然函數(shù)直接量創(chuàng)建的是未命名函數(shù),但是它的語法也規(guī)定它可以指定函數(shù)名,這在編寫調(diào)用自身的遞歸函數(shù)時特別的有用,e.g
var f= function fact(x){if(x<=1)return 1; else return x*fact(x-1);}
總結(jié):function()函數(shù)可以任意的使用,具有通用性,F(xiàn)unction()函數(shù)和函數(shù)直接量具有很多的相似性,他們都是未命名函數(shù)(函數(shù)直接量可以有函數(shù)名,尤其是在子調(diào)用函數(shù)中),函數(shù)直接量有個重要的有點,函數(shù)直接量只被解析和編譯一次,而作為字符串傳遞給Function()構(gòu)造函數(shù)的js代碼則在每次調(diào)用構(gòu)造函數(shù)時只需要被解析和編譯一次。
函數(shù)最重要的特性就是他們能夠被定義和調(diào)用,但是在js中函數(shù)并不只是一種語法,還可以是數(shù)據(jù),可以把函數(shù)賦給變量、存儲在對象的屬性中或存儲在數(shù)組的元素中,傳遞給函數(shù)。其實函數(shù)名并沒有什么實際意義,它只是保存函數(shù)的變量的名字,可以將這個函數(shù)賦給其他的變量,它仍然以相同的方式起作用,
e.g function square(x){x*x;}
var a = square(4);
var b = square;//這種情況下b引用的函數(shù)和square的作用相同
var c = b(5);
除了賦給全局變量之外,還可以將函數(shù)賦給對象的屬性,這是稱函數(shù)為方法;也可以賦給數(shù)組元素。
e.g
var a = new Object; var a = new Object();
a.square = new Function("x","return x*x";);
y = o.square(16);
e.g
var a = new Array(3);
a[0] = function(x){return x*x;};
a[1] = 20;
a[2] = a[0](a[1]);
除這些之外,如何將函數(shù)作為參數(shù)傳遞給其他函數(shù),
e.g
function add(x,y){return x+y;}
function subtract(x,y){return x-y;}
function multiply(x,y){return x*y;}
function dibide(x,y){return x/y;}
function operate(operator,operand1,operand2){
return operator(operand1,operand2);
}
var i = operate(add,operate(add,2,3),operate(multiply,4,5));
var operators = new Object();
operators["add"] = function(x,y){return x+y;}
operators["multiply"] = function(x,y){return x*y;}
operators["divide"] = function(x,y){return x/y;}
operators["pow"] = Math.pow;
function operate2(op_name,operand1,operand2){
if(operators[op_name] == null)return "unknow operator";
else return operators[op_name](operand1,operand2);
}
var j = operate2('add',"hello",operate2("add","","world"));
var k = operate2('pow',10,2);
5.函數(shù)的作用域,調(diào)用對象
函數(shù)的作用域中除了全局變量、函數(shù)內(nèi)部的局部變量和形式參數(shù)外,函數(shù)還定義了一個特殊屬性,
arguments,這個屬性應用了另外一個特殊的對象-----Arguments對象,因為arguments屬性是調(diào)用對象的一個屬性,所以它的狀態(tài)和局部變量以及函數(shù)的形式參數(shù)是相同的。
所以arguments標識符被看做是保留字,不能將它作為變量名或形式參數(shù)名。
6.Arguments對象
arguments它具有特殊的意義,是調(diào)用對象的一個特殊屬性,用來引用Arguments對象,Arguments對象就像數(shù)組,可以按照數(shù)字獲取傳遞給函數(shù)的參數(shù)值,但是它并非真正的Array對象。
arguments具有l(wèi)ength屬性,
可以使用arguments來檢測調(diào)用函數(shù)使用了正確數(shù)目的實際參數(shù),
注意:arguments并非真正的數(shù)組,它是一個Arguments對象,Arguments對象有一個非同尋常的特征,當函數(shù)具有命名了的參數(shù)時,Arguments對象的數(shù)組元素是存放函數(shù)參數(shù)的局部變量的同義詞。
e.g
function(x){
alert(x); //顯示參數(shù)的初始值
arguments[0] = null;//改變數(shù)組預算也會改變x
alert(x); //現(xiàn)在顯示為“null”
除了數(shù)組元素,Arguments對象還定義了callee屬性,用來引用當前正在執(zhí)行的函數(shù),這對未命名的函數(shù)調(diào)用自身非常有用。
e.g
function(x){
if(x<-1)return 1;
return x*arguments.callee(x-1);
}
7.函數(shù)的屬性和方法
由于函數(shù)是對象,所以它具有數(shù)據(jù)和方法。
函數(shù)的length屬性
函數(shù)的屬性length和arguments屬性的length不同,arguments數(shù)組的length屬性指定了傳遞給該函數(shù)的實際參數(shù)數(shù)目,并且arguments屬性的length只在函數(shù)內(nèi)部起作用,而函數(shù)自身的length屬性它是只讀的,返回的是函數(shù)需要的實際參數(shù)的數(shù)目,并且函數(shù)的屬性length函數(shù)體的內(nèi)部和外部都在是有效的。
函數(shù)的prototype屬性
每個函數(shù)都有一個prototype屬性,它引用的是預定義的原型對象,原型對象在使用new運算符把函數(shù)作為構(gòu)造函數(shù)時起作用。
函數(shù)自定義屬性
有時候定義全局變量比較亂,可以通過自定義函數(shù)屬性來解決
函數(shù)的apply()和call()方法
他們的第一個參數(shù)都是要調(diào)用的函數(shù)的對象,在函數(shù)體內(nèi)這一參數(shù)是關(guān)鍵字this的值,call()的剩余參數(shù)是傳遞給要調(diào)用的函數(shù)的值,apply()的剩余參數(shù)是由數(shù)組指定的參數(shù)。
posted on 2009-03-21 12:45 forgood 閱讀(1097) 評論(0) 編輯 收藏 所屬分類: javaScript