1.立即执行函数 -> IIFE - immediately-invoked function expression -> 初始化函数

1.1 特点:

  1. 立即执行
  2. 执行完成后立即释放

    1.2 写法:

    ```javascript /第一种写法 -> 使用较多/ (function(){ })(); /第二种写法 -> W3C建议/ (function(){ }());
  1. <a name="udqAT"></a>
  2. ### 1.3 小括号
  3. 1. 括号可以将函数、值、变量转为表达式
  4. ```javascript
  5. /*能否执行*/
  6. /* -- 1 -- */
  7. function test(){
  8. console.log('能');
  9. }(); //不能执行
  10. /* -- 2 -- */
  11. var test = function test(){
  12. console.log('能');
  13. }(); //能执行
  14. /* -- 3 -- */
  15. (function test(){
  16. console.log('能');
  17. })() //能
  18. /*
  19. 只有表达式才能被执行符号()执行
  20. */
      • * || 能将函数声明转为表达式 ```javascript /报错 无法执行*/ function test(){ console.log(‘1’); }()

/可以执行/

  • function test(){ console.log(‘1’); }()

/不报错,但函数内部也不执行/ function test(){ console.log(‘1’); }(6)

  1. 3. 面试题
  2. ```javascript
  3. /*
  4. 打印的是10个10,利用了闭包和test()的AO
  5. */
  6. function test(){
  7. var arr = [];
  8. for(var i = 0; i< 10; i++){
  9. arr[i] = function(){
  10. document.write(i + ' ');
  11. }
  12. }
  13. return arr;
  14. }
  15. var myArr = test();
  16. for(var j = 0; j < 10; j++){
  17. myarr[j]();
  18. }
  19. /*
  20. 打印1-10
  21. */
  22. function test(){
  23. for(var i = 0; i< 10; i++){
  24. (function(){
  25. document.write((i + 1) ' ');
  26. })()//让函数立即执行
  27. }
  28. }
  29. test();
  30. /*
  31. 第二种方法
  32. */
  33. function test(){
  34. var arr = [];
  35. for(var i = 0; i< 10; i++){
  36. (function(){
  37. arr[j] = function(){
  38. document.write(j + ' ');
  39. }
  40. })(i);
  41. }
  42. return arr;
  43. }
  44. var myArr = test();
  45. for(var j = 0; j < 10; j++){
  46. myarr[j]();
  47. }
  1. 面试题 ```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);

  1. 4.作业
  2. ```javascript
  3. /*累加器 闭包 执行一次加一次并答应 初始数字为0*/
  4. function accumulator() {
  5. var num = 0;
  6. var calculation = {
  7. add: function(){
  8. num++;
  9. console.log("num: " + num);
  10. },
  11. reduce: function(){
  12. num--;
  13. console.log("num:" + num);
  14. },
  15. };
  16. return calculation;
  17. }
  18. var cal = accumulator();
  19. cal.add();
  20. cal.add();
  21. cal.reduce();
  22. cal.reduce();
  23. /*缓存器 一个班级,学生名字保存在一个数组里,两个方法写在函数中的一个对象中,第一个方法加入班级,第二个方法离开班级,每次加入或离开都需要打印新的学生名单*/
  24. function myClass(){
  25. var arr = [];
  26. var opeations = {
  27. join: function(name){
  28. arr.push(name);
  29. console.log(arr);
  30. },
  31. leave: function(name){
  32. /*for(var i = 0; i < arr.length; i++){
  33. var item = arr[i];
  34. if(item === name){
  35. arr.splice(i, 1);
  36. }
  37. }
  38. */
  39. var idx = arr.indexOf(name);
  40. if(idx !== -1){
  41. arr.splice(idx, 1);
  42. }
  43. console.log(arr);
  44. }
  45. };
  46. return opeations;
  47. }
  48. var work = myClass();
  49. work.join('张三');
  50. work.join('李四');
  51. work.join('王五');
  52. work.join('赵六');
  53. work.leave();
  54. work.leave();