匿名函數(shù)
var functionName = function(arg0, arg1,arg2){
//do sth
};
作用:模仿塊級作用域
//用作會計作用域(私有作用域)的匿名函數(shù)的語法
(function(){
//這里是塊級作用域
})(); //函數(shù)聲明加上括號即可
function output(count){
(function(){
for(var i = 0; i < count; i++ ){
console.log(i);
}
})();
console.log(i); // 出錯
}
遞歸
function factorial(num){
if (num <= 1 ){
return 1;
} else {
return num * arguments.callee(num - 1); //使用arguments.callee而不是函數(shù)名的原因是函數(shù)名可能會發(fā)生變化
}
}
嚴格模式下使用命名函數(shù)
var factorial = (function f(num){
if (num <= 1){
return 1;
} else {
return num * f(num - 1);
}
});
閉包
閉包是指有權(quán)訪問另一個函數(shù)作用域中的變量的函數(shù)。創(chuàng)建閉包常見的方式黔衡,就是在一個函數(shù)內(nèi)部創(chuàng)建另一個函數(shù)。
當在函數(shù)內(nèi)部定義了其他函數(shù)是腌乡,就創(chuàng)建了閉包盟劫。閉包有權(quán)訪問包含函數(shù)內(nèi)部的所有變量,原理如下:
- 在后臺執(zhí)行環(huán)境中与纽,閉包的作用域鏈包含著它自己的作用域侣签、包含函數(shù)的作用域和全局作用域。
- 通常急迂,函數(shù)的作用域及其所有變量都會在函數(shù)執(zhí)行結(jié)束后被銷毀影所。
- 當函數(shù)返回了一個閉包是,這個函數(shù)的作用域?qū)恢辉趦?nèi)存中保存到閉包不存在為止僚碎。
function createFunctions(){
var result = new Array();
for (var i = 0; i < 10; i++ ){
result[i] = function(){
return i;
};
}
return result;
}
var result = createFunctions();
result.forEach(function(item, index, array){
console.log(item());//10個10
});
每個函數(shù)都返回10猴娩,因為每個函數(shù)的作用域鏈中都保存著createFunctions()函數(shù)的活動對戲那個,所以它們引用的是同一個變量i勺阐。當createFunction()函數(shù)返回后卷中,變量i的值都是10。
通過定義匿名函數(shù)渊抽,并將立即執(zhí)行該匿名函數(shù)的結(jié)果賦給數(shù)組可以解決這個問題:
function createFunctions(){
var result = new Array();
for (var i = 0; i < 10; i++ ){
result[i] = function(num){
return function(){
return num;
};
}(i);
}
return result;
}
var result = createFunctions();
result.forEach(function(item, index, array){
console.log(item());//0~9
});
作用:用于創(chuàng)建訪問私有變量的公有方法蟆豫。
特權(quán)方法:有權(quán)訪問私有變量和私有函數(shù)的公有方法
//增強的模塊模式
var f = function(){
//私有變量和私有函數(shù)
var privateVar = 10;
function privateFunction(){
return false;
}
//創(chuàng)建對象
var object = new CustomType();
//添加特權(quán)/公有屬性和方法
object.publicProperty = true;
object.publicMethod = function(){
privateVar++;
return privateFunction();
};
return object;
}();
this
幾種特殊情況下,this的值可能會意外改變懒闷。
var name = "The Window";
var object = {
name : "Object",
getName : function(){
return this.name;
}
};
object.getName(); // 'Object"
(object.getName)(); // "Object"
(object.getName = object.getName)(); //"The Window"