匿名函數
var functionName = function(arg0, arg1,arg2){
//do sth
};
作用:模仿塊級作用域
//用作會計作用域(私有作用域)的匿名函數的語法
(function(){
//這里是塊級作用域
})(); //函數聲明加上括號即可
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而不是函數名的原因是函數名可能會發(fā)生變化
}
}
嚴格模式下使用命名函數
var factorial = (function f(num){
if (num <= 1){
return 1;
} else {
return num * f(num - 1);
}
});
閉包
閉包是指有權訪問另一個函數作用域中的變量的函數。創(chuàng)建閉包常見的方式,就是在一個函數內部創(chuàng)建另一個函數。
當在函數內部定義了其他函數是,就創(chuàng)建了閉包。閉包有權訪問包含函數內部的所有變量,原理如下:
- 在后臺執(zhí)行環(huán)境中,閉包的作用域鏈包含著它自己的作用域、包含函數的作用域和全局作用域。
- 通常,函數的作用域及其所有變量都會在函數執(zhí)行結束后被銷毀。
- 當函數返回了一個閉包是,這個函數的作用域將會一只在內存中保存到閉包不存在為止。
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
});
每個函數都返回10,因為每個函數的作用域鏈中都保存著createFunctions()函數的活動對戲那個,所以它們引用的是同一個變量i。當createFunction()函數返回后,變量i的值都是10。
通過定義匿名函數,并將立即執(zhí)行該匿名函數的結果賦給數組可以解決這個問題:
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)建訪問私有變量的公有方法。
特權方法:有權訪問私有變量和私有函數的公有方法
//增強的模塊模式
var f = function(){
//私有變量和私有函數
var privateVar = 10;
function privateFunction(){
return false;
}
//創(chuàng)建對象
var object = new CustomType();
//添加特權/公有屬性和方法
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"