异常
- 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);
}
解释: 为每个迭代都生成一个新的作用域,使得延迟函数的回调可以将新的作用域封闭在每个迭代内部,每次迭代中都会含有一个具有正确值的变量供我们访问。