7-立即执行函数、闭包深入、逗号运算符

(一)、立即执行函数

IIFE immediately- invoked function expression

立即执行函数页面加载的时候就自动执行了,执行完成后立即释放

立即执行函数有一个功能性的称呼-初始化函数

立即执行函数有最基本的两种写法

(1)、写法

写法1

(function(){

})();

写法2------w3c建议的写法

(function(){

}());  
(2)、参数

立即执行函数可以带参数

(function(a,b){
	console.log(a + b); 
}(2,4));
(3)、返回值

立即执行函数也是有返回值的,如果要接受返回值就把交给变量保存起来

var num = (function(a,b){
  return a + b;
}(2,4));
console.log(num);

括号括起来的,是函数也好,是数字也好,是变量也好,都是表达式
括号里面包裹的不管是什么东西都会变成表达式
记住一定是表达式才能被执行符号执行

(function test1(){
  console.log(1);
})();                      //能执行
var test2 = function(){
  console.log(1);
}(); 											//能执行
function test3(){ 
  console.log(1);         //会报语法错误
}();

下面案例能够证明立即执行函数:

1、立即执行

2、执行完就销毁

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UU77V353-1638718070068)(/Users/liruize/Library/Application Support/typora-user-images/image-20211001183544503.png)]

这两种写法效果一样,只要变成了表达式,函数名就被忽略了

(function(){
  console.log(123);
})();

(function test(){
   console.log(123);
})();

​ 将一个函数的声明变成一个表达式

//以下都可以执行(需要将一个函数的声明变成一个表达式)
//函数声明变成表达式的方法 + - !|| &&
//总结下来就是将函数声明转化为表达式后就可以使用执行符号了,立即执行该函数,并且该函数声明的函数名会被忽略
//被括号括起来的任何东西,即使说不是表达式也会被转换成表达式
+ function test(){
 			console.log(1);
 }();  
 
 - function test(){
 			console.log(1);
 }();  
 
  ! function test(){
 			console.log(1);
 }();
 
 1 && function test(){
 console.log(1);
 }();
 
 0 || function test(){
 console.log(1);
 }();

一道面试题

function test(a){
  console.log(1);
}();   //这种写法会报语法错误

function test(a){
 console.log(1);
}(6);  //这种写法不会被报错,因为会把转化成下面的写法


function test(a){
  console.log(1);
}
(6);  //会把这当成表达式
(4)、立即执行函数经典案例
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]();
}
//会打印出来10个10

function test(){
  var arr = [];    //arr里面实际上是存了10个匿名函数
  var i = 0
  for(; i < 10; ){
   arr[i] = function(){
       document.write(i + ' ');
   }
    i++;
  }
  return arr;  //return了10个匿名函数,形成了闭包 return出去的时候i已经变成10了
}

var myArr = test();

for(var j = 0; j < 10 ;j++){  //在循环myArr的时候实际上拿到的是最后一次i的值
  myArr[j](); 
}
//要想打印0到9,就这样写   在循环的时候立即执行
function test(){
  for(var i = 0; i < 10; i++){
     (function(){
       document.write(i + ' ');
     })();
  }
}

test();
//这种写法也能打印0-9   借助外界的力量 传个参数
// 不让我每次取i的值,我每次取j的值,在执行的时候传递不同的参数
function test(){
  var arr = [];
  
  for(var i = 0; i < 10; i++){
     arr[i] = function(num){
         document.write(num + ' ');
     }
  }
  
  return arr;
}

var myArr = test();
for(var j = 0; j < 10; j++){
   myArr[j](j);
}
//这是第三种方法,最常用
//这种方法也行   //通过立即执行函数将每次的i保存下来
function test(){
 var arr = [];
 for(var i = 0; i < 10; i++){
    (function(j){
       arr[j] = function(){
          document.write(j + ' ');
       }
    })(i); // i实参 j是形参 ,每次循环i都会把j替换掉
 }
 
 return arr;
}

var myArr = test();
for(var j = 0; j < 10; j++){
   myArr[j]();
}

(二)、闭包

面试题1、

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7OTJW2bJ-1638718070069)(/Users/liruize/Library/Application Support/typora-user-images/image-20211001200241915.png)]

每次点击都是5

//用立即执行函数将代码包裹起来可以解决这个问题
for(var i = 0; i < oLi.length ; i++){function(j){
      oLi[j].onclick = function(){
         console.log(j);
      }
  }(i);
}
面试题2、
//与这个知识点相关联
var num = (1,2);
console.log(num); //2

//面试题  非常非常重要
var fn = (
  function test1(){
     return 1;
  },
  function test2(){
     return '2';
  }
)();

console.log(typeof(fn)); //string
面试题3、
//非常经典
var a = 10;
if(function b(){}){     // (function b(){})被括号括起来了b就被忽略了
  a += typeof(b);
}
console.log(a);   // 10undefined

(三)、逗号运算符

//逗号是一个运算符只会返回最后一个
console.log((6,5)); //5
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值