Javascript高级程序设计第二版第七章匿名函数--笔记
匿名函數就是沒有名字的函數,有時候也稱為拉姆達(lambda)函數。
function functionName(){};
這是一個函數聲明
在代碼執行以前被加載到作用域中
var functionName = function(){};
這是一個函數表達式
在代碼執行到那一行時才會有定義
7.1 遞歸
arguments.callee是一個指向正在執行的函數的指針,可以實現函數的遞歸調用
function factorial(num){
???????? if(num <= 1){
?????????????????? return 1;
} else {
???????? return num * arguments.callee(num - 1);
}
}
var anotherFactorial = factorial;
factorial = null;
alert(anotherFactorial(4)); // output 24
7.2 閉包
閉包是指有權訪問另一個函數作用域中的變量的函數。創建閉包的常見方式,就是在一個函數內部創建另一個函數。
function fn(propertyName){
???????? return function(object1){
?????????????????? var v1 = object1[propertyName]; //訪問了外部變量propertyName變量
???????? }
}
由于閉包會攜帶包含它的函數的作用域,因此會比其他函數占用更多的內存,過度使用閉包可能會導致內存占用過多。所以建議只是在絕對必要時再考慮使用閉包。
7.2.1 閉包與變量
function createFunctions(){
???????? var result = [];
???????? for(var i=0; i<10; i++){
?????????????????? result[i] = function(num){
??????????????????????????? return function(){
???????????????????????????????????? return num;
??????????????????????????? }
?????????????????? }(i);
???????? }
}
var funcs = createFunctions();
for(var i=0; i<funcs.length; i++){
???????? document.write(funcs[i] + ‘<br />’); //output 0,1,2,3…9
}
7.2.2 this對象
this對象是在運行時基于函數的執行環境綁定的:在全局函數中,this等于window,而當函數被作為某個對象的方法調用時,this等于那個對象。不過,匿名函數的執行環境具有全局性,因此對象通常指向window.
7.2.3 內存泄漏
如果閉包的作用域中保存著一個HTML元素,那么就意味著該元素無法被銷毀。
function assignHandler(){
???????? var element = document.getElementById(‘someElement’);
???????? var id = element.id;
???????? element.onclick = function(){
?????????????????? alert(id);
???????? };
?
???????? element = null; //變量設置為null,才能解除對DOM對象的引用,順利減少引用數,確保正常回收其占用的內存
}
7.3 模仿塊級作用域
匿名函數可以用來模仿塊級作用域:
(function(){
???????? //這里是塊級作用域
})();
將函數聲明包含在一對圓括號中,表示它實際上是一個函數表達式,而緊隨其后的另一對圓括號會立即調用這個函數。
相當于:
var someFunction = function(){};
someFunction();
?
function(){}();
這一段會導致語法錯誤,因為JavaScript將function關鍵字當作一個函數聲明的開始,而函數聲明后面不能跟圓括號。然而,函數表達式的后面可以跟圓括號。要將函數聲明轉換成函數表達式,只要加上一對括號即可。
7.4 私有變量
任何在函數中定義的變量,都可以認為是私有變量。因為在函數外部不能訪問這些變量。
把有權訪問私有變量和私有函數的公有方法叫特權方法。
function MyObject(){
???????? //私有變量
???????? var privateVariable = 10;
???????? function privateFunction(){
?????????????????? return false;
???????? }
???????? //特權方法
???????? this.publicMethod = function(){
?????????????????? privateVariable ++;
?????????????????? return privateFunction();
???????? }
}
7.4.1 靜態私有變量
(function(){
???????? var privateVariable = 10;
???????? function privateFunction(){
??????????????????
???????? }
???????? Myobject = function(){??????????????
???????? }
//公有/特權方法
???????? Myobject.prototype.publicMethod = function(){
?????????????????? privateVariable ++;
?????????????????? return privateFunction();
???????? }
})()
這個模式創建了一個私有作用域,并在其中封裝了一個構造函數及相應的方法。
7.4.2 模塊模式
單例創建私有變量和特權方法。所謂單例就是只有一個實例的對象。簡單的語法如下:
var singleton = {
???????? name: value,
???????? method: function(){
//這里是方法
}
}
還可以添加私有變量和特權方法
var singleton = function(){
???????? //私有變量和私有函數
???????? var privateVariable = 10;
???????? function privateFunction(){}
???????? //特權/公有方法和屬性
???????? return {
???????? publicProperty: true,
???????? publicMethod: function(){
???????? privateVariable++;
???????? return privateFunction();
}
}
}
這個模式返回了一個匿名函數,在函數內部,定義私有變量和函數,然后將一個對象字面量作為函數的值返回。返回的對象字面量中只包含可以公開的屬性和方法。
7.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;
}
轉載于:https://www.cnblogs.com/jikey/archive/2010/10/07/1802068.html
總結
以上是生活随笔為你收集整理的Javascript高级程序设计第二版第七章匿名函数--笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 纸娃娃系统再次增强
- 下一篇: IT信息业、金融业从业人员悲歌