sayHi(); function sayHi(){ alert("Hi!"); }
sayHi(); //錯誤!!函數不存在 var sayHi=function(){ alert("Hi!"); }
function factorial(num){ if (num <= 1){ return 1; } else { return num * factorial(num-1); } }
function factorial(num){ if (num <= 1){ return 1; } else { return num * arguments.callee(num-1); } }
function createFunctions(){ var result = new Array(); for (var i=0; i < 10; i++){ result[i] = function(){ return i; }; } return result; } var funcs = createFunctions(); //every function outputs 10 for (var i=0; i < funcs.length; i++){ document.write(funcs[i]() + "<br />"); }
上面代碼輸出的所有是10。這是由於:每一個funcs函數都保存着createFunctions()這個活動對象(這是一個函數,也是一個對象,也是一個引用類型Function類型),而createFunctions()這個活動對象有一個變量i,因此,每一個funcs都將擁有這個變量i,而createFunctions()這個函數在返回結果時,i已經變成10了。因此funcs數組的每一個值都是10.javascript
function createFunctions(){ var result = new Array(); for (var i=0; i < 10; i++){ result[i] = function(num){ return function(){ return num; }; }(i); } return result; }
在調用每一個匿名函數時,將i的當前值給了num,而在匿名函數內部,建立並返回num的閉包。這樣,返回數組的每一個函數都有本身num變量的一個副本。(這段沒有說清,讀者本身再揣摩,若是有更好的描述方法,請評論在文章下面,謝謝)java
function outputNumbers(count){ for (var i=0; i < count; i++){ alert(i); } alert(i); //count } outputNumbers(5);
在Java等語言中,for裏面的變量i用完就銷燬了。而在javascript中,outputNumbers調用時生成活動對象,而這個i是屬於這個活動對象的,所以從它被定義開始,就能夠在函數內部隨處訪問它,它在該活動對象內部是共有的。數組
(function(){ //這裏是塊級做用域 })();
函數聲明放在圓括號中,表示它是一個表達式,然後面再加個括號就能夠當即調用它。閉包
function outputNumbers(count){ (function () { for (var i=0; i < count; i++){ alert(i); } })(); alert(i); //causes an error }
上面代碼中,i就被私有了,在匿名函數(私有域)外部訪問i時就會報錯,儘管alert依然在活動對象內。函數
function add(num1,num2){ var sum = num1 + num2; return sum; }
有3個私有變量:num1,num2,sum。函數內部能夠訪問它們,外部就不行了。this
function Person(name){
var a=0; this.getName = function(){ return name + a; }; this.setName = function (value) { name = value; }; }
this.getName、this.setName就是表達式方式,在建立Person實例後,只能經過getName或者setName來訪問name、a屬性。