標籤:建立 result java 匿名函數 模仿 some 函數範圍 建構函式 變數
函式宣告
函式宣告提升
函數運算式
匿名函數/拉姆達函數
1 遞迴
2 閉包(有權訪問另一個函數範圍中的變數的函數)
2.1 閉包與變數
閉包只能取得包含函數中任何變數的最後一個值。
function createFunctions() { var result = new Array(); for (var i = 0; i < 10; i++) { result[i] = function() { return i; } } return result;}
// 結果返回10個10;
可以通過建立另一個匿名函數強制讓閉包的行為符合預期(但是感覺有點蠢而且容易亂)
function createFunctions() { var result = new Array(); for (var i = 0; i < 10; i++) { result[i] = function(num) { return function() { return num; } } }}
2.2 關於this對象
匿名函數的執行環境具有全域性,通過call()或apply()改變函數執行環境的情況下,this就會指向其他對象。
var name = "The Window";var object = { name: "My Object", getNameFunc: function() { return function() { return this.name; } }};alert(object.getNameFunc()()); //"The Window"(在非strict 模式下)
2.3 記憶體流失
如果閉包的範圍鏈中儲存著一個html元素,將會導致該元素無法被銷毀。
function assignHandler() { var element = document.getElementById("someElement"); var id = element.id; element.onclick = function() { alert(id); }; //Important!!! element = null;}
3 模仿塊級範圍
JavaScript沒有塊級範圍的概念。
function outputNumbers(count) { for (var i=0; i < count; i++) { alert(i); } alert(i); //計數}
匿名函數可以用來模仿塊級範圍。
(function() { // 這裡是塊級範圍})();
function() { }(); //出錯!
4 私人變數
JavaScript中並沒有私人成員的概念,所有對象屬性都是公有的。
有權訪問私人變數和私人建構函式的公有方法被稱為特權方法。
function MyObject() { //私人變數和私人函數 var privateVariable = 10; function privateFunction() { return false; }; this.publicMethod = function() { privateVariable++; return privateFunction(); };}
4.1 靜態私人變數
(function() { //私人變數和私人函數 var privateVariable = 10; function privateFunction() { return false; } MyObject = function() { }; MyObject.prototype.publicMethod = function() { privateVariable++; return privateFunction(); };})();
4.2 模組模式
var singleton = function() { //私人變數和私人函數 var privateVariable = 10; function privateFunction() { return false; } return { publicProperty: true, publicMethod: function() { privateVariable++; return privateFunction(); } };};
4.3 增強模組模式
var singleton = function() { //私人變數和私人函數 var privateVariable = 10; function privateFunction() { return false; } //建立對象 var object = new CustomType(); //添加特權/公有屬性和方法 object.publicProperty = true; object.publicMethod = function() { privateVariable++; return privateFunction(); }; //返回這個對象 return object;};
JavaScript函數運算式