立即执行函数与let

在javascript中没有私有作用域的概念,其实现在的es6中的let声明就是为了解决这样的问题。但是在国内大部分公司的面试官还是喜欢去问一下var声明的问题或立即执行函数的问题。

1.js查找变量遵循由内而外,一层一层的查找,查到就不再向上查找了,直到查不到返回undefined;

什么是私有作用域呢,如下例:

var a = 100;

if(a>10){
  var b = 200;
}

console.log(b);//200
b居然输出为200,就是这样不合理,我想要表达的是b在自己的大括号内可以使用,出了这个大括号别人都看不到。

因此es6提出了let,就解决了私有作用域这个问题。

有其中两点:

var声明的b,即使if条件为false,b这个变量也是被占上坑了,所以后面只会输出undefined,而不会报错;

let声明的b,无论if条件true还是false,b只在自己的大括号内生效,出个这个大括号,没人知道,所以输出b的这一行永远报错。

以上let的效果,永远可以像这样模拟

var a = 100;

if(a>10000){
  (function() {
    var b=200;
  })()
}

console.log(b);

立即执行函数实现了块级作用域的感觉,感觉像一个容器,其内部声明的变量永远外部无法得知,但是其内部可以访问外部声明的变量。所以内部定义的变量不会和外部的变量发生冲突,俗称“匿名包裹器”或“命名空间”。


变态的面试题:

var name

(function() {
  //这里name是一个特殊的变量
  if(name === undefined){
    console.log('hello world')
  }else {
    console.log('hello js')
  }
})()

执行结果:hello js

因为name是window对象默认的一个属性(用来实现跨域),再次声明默认值是一个空字符串,所以name不等于undefined。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值