立即执行函数与let

来源:互联网 发布:如何调用数组方法 编辑:程序博客网 时间:2024/06/06 02:25

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

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

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

var a = 100;if(a>10000){  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。

原创粉丝点击