Javascript高级程序设计第二版第七章匿名函数--笔记
匿名函數(shù)就是沒有名字的函數(shù),有時候也稱為拉姆達(dá)(lambda)函數(shù)。
function functionName(){};
這是一個函數(shù)聲明
在代碼執(zhí)行以前被加載到作用域中
var functionName = function(){};
這是一個函數(shù)表達(dá)式
在代碼執(zhí)行到那一行時才會有定義
7.1 遞歸
arguments.callee是一個指向正在執(zhí)行的函數(shù)的指針,可以實現(xiàn)函數(shù)的遞歸調(diào)用
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 閉包
閉包是指有權(quán)訪問另一個函數(shù)作用域中的變量的函數(shù)。創(chuàng)建閉包的常見方式,就是在一個函數(shù)內(nèi)部創(chuàng)建另一個函數(shù)。
function fn(propertyName){
???????? return function(object1){
?????????????????? var v1 = object1[propertyName]; //訪問了外部變量propertyName變量
???????? }
}
由于閉包會攜帶包含它的函數(shù)的作用域,因此會比其他函數(shù)占用更多的內(nèi)存,過度使用閉包可能會導(dǎo)致內(nèi)存占用過多。所以建議只是在絕對必要時再考慮使用閉包。
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對象是在運行時基于函數(shù)的執(zhí)行環(huán)境綁定的:在全局函數(shù)中,this等于window,而當(dāng)函數(shù)被作為某個對象的方法調(diào)用時,this等于那個對象。不過,匿名函數(shù)的執(zhí)行環(huán)境具有全局性,因此對象通常指向window.
7.2.3 內(nèi)存泄漏
如果閉包的作用域中保存著一個HTML元素,那么就意味著該元素?zé)o法被銷毀。
function assignHandler(){
???????? var element = document.getElementById(‘someElement’);
???????? var id = element.id;
???????? element.onclick = function(){
?????????????????? alert(id);
???????? };
?
???????? element = null; //變量設(shè)置為null,才能解除對DOM對象的引用,順利減少引用數(shù),確保正常回收其占用的內(nèi)存
}
7.3 模仿塊級作用域
匿名函數(shù)可以用來模仿塊級作用域:
(function(){
???????? //這里是塊級作用域
})();
將函數(shù)聲明包含在一對圓括號中,表示它實際上是一個函數(shù)表達(dá)式,而緊隨其后的另一對圓括號會立即調(diào)用這個函數(shù)。
相當(dāng)于:
var someFunction = function(){};
someFunction();
?
function(){}();
這一段會導(dǎo)致語法錯誤,因為JavaScript將function關(guān)鍵字當(dāng)作一個函數(shù)聲明的開始,而函數(shù)聲明后面不能跟圓括號。然而,函數(shù)表達(dá)式的后面可以跟圓括號。要將函數(shù)聲明轉(zhuǎn)換成函數(shù)表達(dá)式,只要加上一對括號即可。
7.4 私有變量
任何在函數(shù)中定義的變量,都可以認(rèn)為是私有變量。因為在函數(shù)外部不能訪問這些變量。
把有權(quán)訪問私有變量和私有函數(shù)的公有方法叫特權(quán)方法。
function MyObject(){
???????? //私有變量
???????? var privateVariable = 10;
???????? function privateFunction(){
?????????????????? return false;
???????? }
???????? //特權(quán)方法
???????? this.publicMethod = function(){
?????????????????? privateVariable ++;
?????????????????? return privateFunction();
???????? }
}
7.4.1 靜態(tài)私有變量
(function(){
???????? var privateVariable = 10;
???????? function privateFunction(){
??????????????????
???????? }
???????? Myobject = function(){??????????????
???????? }
//公有/特權(quán)方法
???????? Myobject.prototype.publicMethod = function(){
?????????????????? privateVariable ++;
?????????????????? return privateFunction();
???????? }
})()
這個模式創(chuàng)建了一個私有作用域,并在其中封裝了一個構(gòu)造函數(shù)及相應(yīng)的方法。
7.4.2 模塊模式
單例創(chuàng)建私有變量和特權(quán)方法。所謂單例就是只有一個實例的對象。簡單的語法如下:
var singleton = {
???????? name: value,
???????? method: function(){
//這里是方法
}
}
還可以添加私有變量和特權(quán)方法
var singleton = function(){
???????? //私有變量和私有函數(shù)
???????? var privateVariable = 10;
???????? function privateFunction(){}
???????? //特權(quán)/公有方法和屬性
???????? return {
???????? publicProperty: true,
???????? publicMethod: function(){
???????? privateVariable++;
???????? return privateFunction();
}
}
}
這個模式返回了一個匿名函數(shù),在函數(shù)內(nèi)部,定義私有變量和函數(shù),然后將一個對象字面量作為函數(shù)的值返回。返回的對象字面量中只包含可以公開的屬性和方法。
7.4.3 增強(qiáng)的模塊模式
var singleton = function(){
???????? //私有變量和私有函數(shù)
???????? var privateVariable = 10;
???????? function privateFunction(){
???????? return false;
}
//創(chuàng)建對象
var object = new CustomType();
//添加特權(quán)/僅有屬性和方法
object.publicProperty = true;
object.publicMethod = function(){
???????? privateVariable++;
???????? return privateFunction();
};
return object;
}
轉(zhuǎn)載于:https://www.cnblogs.com/jikey/archive/2010/10/07/1802068.html
總結(jié)
以上是生活随笔為你收集整理的Javascript高级程序设计第二版第七章匿名函数--笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 纸娃娃系统再次增强
- 下一篇: 《码出高效-阿里巴巴Java开发手册-泰