js 函數理解

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;



參考:  點擊打開鏈接
              點擊打開鏈接






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章