异常

  1. ReferenceError 同作用域判别失败相关,例如RHS查询在所以嵌套的作用域中遍历寻找不到所需的变量。
  2. 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);
}

解释: 为每个迭代都生成一个新的作用域,使得延迟函数的回调可以将新的作用域封闭在每个迭代内部,每次迭代中都会含有一个具有正确值的变量供我们访问。