JS知识点总结
一、关于变量提升与临时性死区
直接上题
下面的代码中会打印出多少?
var a = 1;
function fn() {
console.log(a);
if (false) {
var a = 2;
}
}
fn();
这里考察了JS
的变量提升,但很多情况大家都想到了全局和函数作用域中的变量提升,却没有注意到判断语句中的变量提升(因为使用的var
关键字没有块级作用域)。变量提升后的代码为:
var a;
function fn() {
var a;
console.log(a);
if (false) {
a = 2;
}
}
a = 1;
fn();
现在很明显,log
会打印出undefined
那如何打印出1呢,我们使用let
声明变量就会产生TDZ
(临时性死区),这样if块中的变量就不会提升到函数顶层作用域中去了。
var a = 1;
function fn() {
console.log(a);
if (false) {
let a = 2;
}
}
fn();
二、如何跳出forEach循环
因为传入forEach
函数的参数是一个函数,所以在这个函数里写return
并不能跳出循环,写break
因为并没有在循环也会报错。因此,要想跳出循环,可以利用try...catch...
,当需要跳出循环时,抛出一个错误,外部处理这个错误即可跳出循环。
try {
namesArr.forEach(val => {
if (val === 'tjj') {
throw new Error();
}
console.log('name:', val);
});
} catch (err) {
console.log('break foreach');
}