1函數聲明:
(1)function命令:
function foo(){
//函數體
};
(2)函數表達式:
匿名函數表達式:
var print=function(){
//函數體
//將匿名函數賦值給變量,
};
命名式函數表達式:若將一個有函數名的函數賦值給變量,則此函數名只在函數內部有效:
var print=function foo(){
alert(typeof foo);
};
foo;//foo is not defined(…)
print();//function
這種寫法的用處有兩個,一是可以在函數體內部調用自身,二是方便除錯(除錯工具顯示函數調用棧時,將顯示函數名,而不再顯示這裏是一個匿名函數)函數的表達式需要在語句的結尾加上分號,表示語句結束。而函數的聲明在結尾的大括號後面不用加分號。
立即執行函數表達式:
(function(){
//函數體
})();
作爲返回值
return function(){
//函數體
}
(3)Function構造函數
var add = new Function(
'x',
'y',
'return (x + y)'
);
Function構造函數接受三個參數,除了最後一個參數是add函數的“函數體”,其他參數都是add函數的參數。Function構造器內部創建的變量是局部變量。在Function構造器外部無法訪問。
Function構造器能使用全局變量,但是,不能使用自由變量
var globalVal="hello";
(function(){
var localVal="world";
Function('console.log(typeof localVal,typeof globalVal);')();
})();
//undefined string
函數表達式和函數聲明的區別:函數聲明會被前置,函數表達式則不會。
sum(1,2);//可以在函數聲明前調用
function sum(a,b){
alert(a+b);
}
//result:3
相當於:
function sum(a,b);
sum(1,2);//可以在函數聲明前調用
function sum(a,b){
alert(a+b);
}
函數表達式:
add(1,2);
var add=function sum(a,b){
alert(a+b);
}
//result:add is not a function(…)
相當於:
var add;
add(1,2);
var add=function sum(a,b){
alert(a+b);
}
//result:add is not a function(…)
函數聲明 | 函數表達式 | 函數構造器 | |
前置 | √ | ||
允許匿名 | √ | √ | |
立即調用 | √ | √ | |
在定義該函數的作用域通過函數名訪問 | √ | ||
沒有函數名 | √ |
2函數的屬性和方法:
1name屬性:函數的name屬性總是返回緊跟在function關鍵字之後的那個函數名。
匿名函數的name屬性總是爲空字符串。
2length屬性:length屬性返回函數預期傳入的參數個數,即函數定義之中的參數個數。
3toString()方法:返回函數源碼。(函數內部的註釋也可以返回)
3函數作用域:
在函數外部聲明的變量就是全局變量(global variable),它可以在函數內部讀取。
在函數內部定義的變量,外部無法讀取,稱爲“局部變量”(local variable)。
注意,對於var命令來說,局部變量只能在函數內部聲明,在其他區塊中聲明,一律都是全局變量。
函數本身的作用域:
函數本身也是一個值,也有自己的作用域。它的作用域與變量一樣,就是其聲明時所在的作用域,與其運行時所在的作用域無關。
4函數參數:
函數參數不是必需的,Javascript允許省略參數。被省略的參數默認值爲undefined。
通過下面的方法,可以爲函數的參數設置默認值。
function f(a) {
(a !== undefined && a !== null) ? a = a : a = 1;
return a;
}
f() // 1
f('') // ""
f(0) // 0
上面代碼中,函數f的參數是空字符或0,都不會觸發參數的默認值。
5參數傳遞:
1值傳遞:函數內部修改參數,不會影響函數外部。
2引用傳遞(數組,對象,其它函數)
如果函數內部修改的,不是參數對象的某個屬性,而是替換掉整個參數,這時不會影響到原始值。
var obj = [1, 2, 3];
function f(o){
o = [2, 3, 4];
}
f(obj);
obj // [1, 2, 3]
上面代碼中,在函數f內部,參數對象obj被整個替換成另一個值。這時不會影響到原始值。這是因爲,形式參數(o)與實際參數obj存在一個賦值關係。
o = obj;
參考: 點擊打開鏈接
點擊打開鏈接