在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。