纪念js中的那些坑

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 秘密花园

你可能感兴趣的:(纪念js中的那些坑)