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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 函数和对象 1、函数 1.1 函数概述 函数对于任何一门语言来说都是核心的概念。通过函数可以封装任意多条语句,而且...
    道无虚阅读 4,615评论 0 5
  • 继承 一、混入式继承 二、原型继承 利用原型中的成员可以被和其相关的对象共享这一特性,可以实现继承,这种实现继承的...
    magic_pill阅读 1,075评论 0 3
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,877评论 0 38
  • 对于任何编程语言来说,都有一个很基础但也很重要的概念:变量的管理;它包括变量的声明,变量的赋值,变量的存储,变量的...
    简xiaoyao阅读 849评论 4 1
  • 没搞错吧!js写了那么多年,this还是会搞错!没搞错,javascript就是回搞错! ………… 在写java的...
    zhoulujun阅读 1,455评论 0 11