一、匿名函数的代码模式
- 匿名函数:就是定义时未直接指定名称的函数
- 因为非匿名函数在定义时,就已经创建函数对象和作用域对象;所以,即使未调用,也占用内存空间;
- 匿名函数, 仅在调用时, 才临时创建函数对象和作用域链对象;调用完,立即释放,所以匿名函数比非匿名函数更节省内存空间
1、错误模式:
其无法工作,浏览器会报语法错。
function(){ alert(1); }();
2、函数字面量:
首先声明一个函数对象,然后执行它。
(function(){ alert(1); } ) ( );
3、优先表达式:
( function(){ alert(2); } ( ) );
4、void操作符:
void function(){ alert(3); }()这三种方式是等同的
二、用法
1 分析: 函数为何要有名字? 是为了方便下次使用. 匿名函数, 即没有名字.
2 用途: 通常不希望再次使用(即只使用一次的)的函数可以定义为匿名函数.
// 定义并使用一个匿名函数来打印从1到10的整数
(function (n) {
for (var i = 1; i <= n; i++)
console.log(i);
})(10);
-
扩展: 当然, 如果还是想再次使用匿名函数的话, 也有方法. 即把匿名函数赋给一个变量(funtion类型的变量), 想再次使用时, 使用该变量来调用即可.示例如下:
// 定义一个匿名函数并将它赋给变量printN var printN = function (n) { for (var i = 1; i <= n; i++) console.log(i); }; // 通过变量printN来再次使用该匿名函数 printN(10);
三、作用——防止全局变量污染
1.输出:弹出3次 i=3
for(var i=0;i<3;i++){
setTimeout(function(){
alert(i);
});
}
2.输出:分别弹出 0 1 2
匿名函数不会被全局污染
for(var i=0;i<3;i++){
(function(i){
setTimeout(function(){
alert(i);
});
})(i);
}