匿名函数
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而不是函数名的原因是函数名可能会发生变化
}
}
严格模式下使用命名函数
var factorial = (function f(num){
if (num <= 1){
return 1;
} else {
return num * f(num - 1);
}
});
闭包
闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包常见的方式,就是在一个函数内部创建另一个函数。
当在函数内部定义了其他函数是,就创建了闭包。闭包有权访问包含函数内部的所有变量,原理如下:
- 在后台执行环境中,闭包的作用域链包含着它自己的作用域、包含函数的作用域和全局作用域。
- 通常,函数的作用域及其所有变量都会在函数执行结束后被销毁。
- 当函数返回了一个闭包是,这个函数的作用域将会一只在内存中保存到闭包不存在为止。
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。
通过定义匿名函数,并将立即执行该匿名函数的结果赋给数组可以解决这个问题:
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
});
作用:用于创建访问私有变量的公有方法。
特权方法:有权访问私有变量和私有函数的公有方法
//增强的模块模式
var f = function(){
//私有变量和私有函数
var privateVar = 10;
function privateFunction(){
return false;
}
//创建对象
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"