异常
- ReferenceError 同作用域判别失败相关,例如RHS查询在所以嵌套的作用域中遍历寻找不到所需的变量。
- TypeError 则代表作用域判别成功了,但是对结果的操作是非法或不合理的。比如试图对一个非函数类型的值进行函数调用,或者引用 null 或 undefined 类型的值中的属性。
foo(); // TypeError
bar(); // ReferenceError
var foo = function bar() {
//...
}
//经过提升后,实际会被理解成
var foo;
foo(); // TypeError
bar(); // ReferenceError
foo = function() {
var bar = ...self...
}
闭包 -> 在自身的词法作用域以外执行
for( var i = 1; i<= 5;i++){
setTimeout( function timer() {
console.log(i)
},i*1000);
}
每秒一次输出五次6
原因: 延迟函数的回调会在循环结束时才执行。事实上,当定时器运行时,即便每个迭代中执行的是setTimeout(... , 0 ),所有的回调函数依然是循环结束时才会被执行。
//解决方法
for(var i = 1; i<=5 ; i++){
(function(j){
setTimeout( function timer() {
console.log( j );
}, j* 1000)
})(i);
}
ES6:
for(let i = 1;i <= 5;i++ ){
setTimeout( function timer() {
console.log( 1 );
},i*1000);
}
解释: 为每个迭代都生成一个新的作用域,使得延迟函数的回调可以将新的作用域封闭在每个迭代内部,每次迭代中都会含有一个具有正确值的变量供我们访问。