1.javascript定義函數的三種方法
一、function語句//這個方法比較常用
function fn(){
alert("這是使用function語句進行函數定義");
}
fn();
二、Function()構造函數
var F = new Function("a","b","alert(a+b)");
F(a,b);
其實相當於如下代碼:
function F(a,b){
alert(a+b);
}
三、函數直接量//這個方法比較常用
var zhenn = function(){
alert("zhenn");
}
zhenn();
雖然函數直接量創建的是未命名函數,但是它的語法也規定它可以指定函數名,這在編寫調用自身的遞歸函數時非常有用,例如:
var f = function fact(x) {
if (x <= 1) {
return 1;
} else {
return x * fact(x - 1);
}
};
注:它並沒有真正創建一個名為fact()函數,只是允許函數體用這個名字來引用自身。JavaScript1.5之前的版本中沒有正確實現這種命名的函數直接量。
2.其他說明
一、構造函數
其實從字面上理解,構造函數似乎也是函數,其實它並不是函數,而只是一種函數模型。
要實例化才能運行,就跟我們寫的類一樣,要new一下才能用。
function Fn(){ //定義構造函數
this.elem ="字符串";
this.fn = function(){
alert("函數");
}
}
var f = new Fn(); //實例化
alert(f.elem);
f.fn();
二.Function()構造函數和函數直接量差別 Function()構造函數和函數直接量之間的差別有一點就是:使用構造函數Function()創建的函數不使用詞法作用域,相反的,它們總是被頂級函數來編譯,如: var y = "global";
function constructFunction() {
var y = "local";
//Function()構造函數
return new Function("return y;");//不使用局部作用域
}
function constFunction() {
var y = "local";
//函數直接量
var f = function () {
return y;//使用局部作用域
};
return f;
}
alert(constructFunction()()); //顯示 global,因為Function()構造函數返回的函數並不使用局部作用域
alert(constFunction()());//顯示 lobal,因為函數直接量返回的函數並使用局部作用域
三.函數直接量詳細說明
在一些框架代碼中偶爾會看到這樣的寫法:(如jquery)
代碼一:
var tempObject = function doFunction() {
...
}();
代碼二:
(function doFunction() {
...
})();
如果我把這個單獨拿出來,你可能也一眼就看出來這段代碼的巧妙之處了--它在構造函數直接量的同時直接運行了此函數,而第二種代碼相對第一種而言更簡潔了(PS:第二種代碼用一對小括號避免了編譯錯誤)。