js经典面试题
一、
输出打印 undefined \n undefined \n 12
var 定义的变量 会自动提升值所在作用域的顶端,如下:
二、
输出打印undefinde \n 12 \n 13
var变量提升后如下, 这个是时候其实只定义了一个全局变量a ,所以在fn()这个作用域中给 a 改变赋值 全局变量a 也是改变了的
三、
let 定义的变量是不存在提升的,并且,只要是当前作用域定义了该变量,那么就不能往上层寻找,所以上面两个输出打印都是报错的,如果删除前面两个输出,最后一个打印12
四、
这里的 a = 12 也是成立的,定义变量可以不使用任何关键字,但是在定义该变量之前,不能使用该变量(这是一种不规范写法)
但是直接定义也不会存在定义变量名提升,所以第一个输出打印是报错的,第二个也是,let定义的变量不提升且当前作用域定义了a 所以报错
五、
输出打印:10
var定义的变量会提升到当前作用的最顶端,那么foo在执行if语句是就是undefined取非,执行foo = 10 ,如下:
六、
输出打印:1 因为这里bar()中的foo 没有重新用var定义所以 1 取非值是false,不执行foo = 10 的语句,当前作用域也没有重新定义 foo ,foo的值往上一层作用域找 值为1
七、
输出打印:11 \n 12 \n 0
这里需要注意的是 b()函数中使用的 n ,是 a()函数这个作用域中定义的 n, 而最后一个输出打印使用的 n 是全局变量 n 所以输出打印 0
八、
输出打印 10 \n 11 \n 3
九、
输出打印:undefined
十、
输出打印:3 \n 10 \n undefined
如果调用函数中没有返回值 默认返回undefined
十一、
输出打印:5 \n 5 \n 6 \n 2
a++ 先返回a的值,后加一;++a 先加一,在返回a的值;
十二、
输出打印:[0,2,3,4] \n [100]