0X01
js 中不存在块级作用域
for(var i=0,list = [];i<10;i++){
list.push(function(){console.log('i='+i)})
}
list[1](); // 10
for(var i=0;i<10;i++){
list[i](); // 0 1 2 3 4 5 6 7 8 9
}
0X02
js中存在一个特性-变量提升(Hoisting),变量的声明都将会被提升到当前作用域的顶部,如
if (!a) {
var a = 1;
}
console.log(a); // 1
这相当于
var a;
if(!a){
a = 1;
}
console.log(a);
再看一个例子
var x = 1;
(function foo(){
console.log(x); // undefined
var x = 10;
})();
0X03
this的指向
Foo = {value:1};
Foo.method = function() {
function test() {
console.log(this.value);
// 这里this不会指向Foo ,而会被设置为全局对象,浏览器中则为window
}
test();
}
Foo.method();
// 解决方案
Foo.method = function() {
var that = this;
function test() {
console.log(that.value);
// 使用 that 来指向 Foo 对象
}
test();
}
Foo.method();
另外将一个方法赋值给变量时,this的指向也会发生改变。
var test = someObject.methodTest;
test();
上例中,test 就像一个普通的函数被调用,函数内的 this 将不再被指向到 someObject 对象。
推荐一份很好的文档
JavaScript 秘密花园