1.立即执行函数 -> IIFE - immediately-invoked function expression -> 初始化函数
1.1 特点:
- 立即执行
- 执行完成后立即释放
1.2 写法:
```javascript /第一种写法 -> 使用较多/ (function(){ })(); /第二种写法 -> W3C建议/ (function(){ }());
<a name="udqAT"></a>
### 1.3 小括号
1. 括号可以将函数、值、变量转为表达式
```javascript
/*能否执行*/
/* -- 1 -- */
function test(){
console.log('能');
}(); //不能执行
/* -- 2 -- */
var test = function test(){
console.log('能');
}(); //能执行
/* -- 3 -- */
(function test(){
console.log('能');
})() //能
/*
只有表达式才能被执行符号()执行
*/
- !* || 能将函数声明转为表达式 ```javascript /报错 无法执行*/ function test(){ console.log(‘1’); }()
/可以执行/
- function test(){ console.log(‘1’); }()
/不报错,但函数内部也不执行/ function test(){ console.log(‘1’); }(6)
3. 面试题
```javascript
/*
打印的是10个10,利用了闭包和test()的AO
*/
function test(){
var arr = [];
for(var i = 0; i< 10; i++){
arr[i] = function(){
document.write(i + ' ');
}
}
return arr;
}
var myArr = test();
for(var j = 0; j < 10; j++){
myarr[j]();
}
/*
打印1-10
*/
function test(){
for(var i = 0; i< 10; i++){
(function(){
document.write((i + 1) ' ');
})()//让函数立即执行
}
}
test();
/*
第二种方法
*/
function test(){
var arr = [];
for(var i = 0; i< 10; i++){
(function(){
arr[j] = function(){
document.write(j + ' ');
}
})(i);
}
return arr;
}
var myArr = test();
for(var j = 0; j < 10; j++){
myarr[j]();
}
- 面试题 ```javascript / 点击0显示1 点击1显示2 点击2显示3 点击3显示4 点击4显示5 / var oLi = doucument.querySelectorAll(‘li’); for(var i = 0; i < oLi.length; i++){ oLi[i].onclick = function(){ console.log(i); } } //此时 点击任何一个数都显示5 解决办法如下: var oLi = doucument.querySelectorAll(‘li’); for(var i = 0; i < oLi.length; i++){ (function(j){ oLi[i].onclick = function(){ console.log(j); } })(i); }
/逗号运算符/ var fn = ( function test1(){ return 1; }, function test2(){ return 2; } )(); console.log(typeof(fn));
/括号 - 表达式/ var a = 10; if( function b(){} ){ a += typeof(b); } console.log(a);
4.作业
```javascript
/*累加器 闭包 执行一次加一次并答应 初始数字为0*/
function accumulator() {
var num = 0;
var calculation = {
add: function(){
num++;
console.log("num: " + num);
},
reduce: function(){
num--;
console.log("num:" + num);
},
};
return calculation;
}
var cal = accumulator();
cal.add();
cal.add();
cal.reduce();
cal.reduce();
/*缓存器 一个班级,学生名字保存在一个数组里,两个方法写在函数中的一个对象中,第一个方法加入班级,第二个方法离开班级,每次加入或离开都需要打印新的学生名单*/
function myClass(){
var arr = [];
var opeations = {
join: function(name){
arr.push(name);
console.log(arr);
},
leave: function(name){
/*for(var i = 0; i < arr.length; i++){
var item = arr[i];
if(item === name){
arr.splice(i, 1);
}
}
*/
var idx = arr.indexOf(name);
if(idx !== -1){
arr.splice(idx, 1);
}
console.log(arr);
}
};
return opeations;
}
var work = myClass();
work.join('张三');
work.join('李四');
work.join('王五');
work.join('赵六');
work.leave();
work.leave();