JavaScript笔试面试题收集(五)

本系列主要在于对自己的日常学习的内容做一个归纳整理,同时分享一些平时遇到的一些比较好的面试题.

通过对笔试面试题的学习,强化自己的所学知识面.

函数作用域的变量提升问题

1
2
3
4
5
6
7
var tmp = new Date()
function f() {
console.log(tmp) // undefined
if(false) {
var tmp = 'Hello World'
}
}

此题涉及到了函数作用域的变量提升问题.

因为函数是没有块级作用域的,只有函数作用域

所以if判断即使为空,编译器预编译的阶段其内部变量声明也会提升到函数作用域的最顶端.

这个时候因为有了tmp的声明,所以tmp就不会往外面的作用域找值了,会直接返回一个undefined.

let的作用域问题

1
2
3
4
5
6
7
8
function f1() {
let n = 5;
if(true) {
let n = 10;
}
console.log(n) // 5
}
f1()

let是es6成为国际标准的声明方式,由let声明的变量是可以有块级作用域的,所以即使我们使用了if判断语句,其里面的变量也是外面无法访问到的.

另外,es6还支持块级作用域的任意嵌套

1
2
3
4
5
6
7
8
9
10
11
{
{
{
let a = 1;
{
console.log(a) // 报错, a is not defined
let a = 2;
}
}
}
}

以上的写法是没有错误的.还有一点要注意的是,因为不同的块级作用域是不同的,所以可以同时定义相同的变量

文章目录
  1. 1. 函数作用域的变量提升问题
  2. 2. let的作用域问题
|