规则
- 除了函数外,js没有块级作用域,查看demo1
- 作用域链:内部可以访问外部的变量,但是外部不能访问内部的变量,查看demo1代码一,demo2(注意:内部有该变量就先用该变量,没有再逐一向外查找demo2 代码二)
- 声明变量的是var还是window. 查看面试题一
- JS有变量提升的机制,查看面试题二,面试题三
- 优先级:声明变量>声明函数>参数>变量提升(不用记)
面试的时候怎么看?
1.本层作用域有没有该变量【注意变量提升】
2.注意:js除了函数外没有块级作用域
demo1
函数有块级作用域,该案例外部无法获取函数内部的变量
代码一
function fun(){
var a = '123'
}
fun()
console.log(a) // a is not defined
除了函数以外,没有块级作用域,let和const定义的变量先除开
代码二
if(true){
var a = 9;
}
console.log(9) // 9
for(var j=0; j<10; j++){}
console.log(j) // 10
demo2
内部可以访问外部的变量
代码一
var a = 60
function fn(){
console.log(a)
}
fn() // 60
注意 代码二
var a = 10
function fn(){
var a = 20
function foo(){
var a= 30
console.log(a)
}
foo();
}
fn() // 30
面试题一
var a = b = 10;可以看成是var a = 10; window.b = 10
(function(){
var a = b = 10;
// var a = 10;
// b = 10;
// window.b = 10;
})()
console.log(b) // a is not defined
console.log(b) // 10
面试题二
注意!!
function c(){
var b = 1
function a(){
//这里第一行不会向外找b,因为下面有var b,就会进行变量提升,不会向上一层去找b了
console.log(b) //undefined
var b = 2;
console.log(b) //2
}
a()
console.log(b) //1
}
c()
面试题三
函数作用域里面有name,变量声明提升
var name = 'World';
(function(){
//var name = undefined 声明悬挂
if(typeof name === 'undefined'){
var name = 'Jack';
console.log('goodbye ' + name)
}else{
console.log('hello ' + name)
}
})()
// goodbye Jack
类似的面试题
// var a = undefined
console.log(a) // undefined
if(false){
var a = 10;
}
console.log(a) // undefined
优先级