对JavaScript的深入理解

  1. 一切(引用类型)都是对象,对象是属性的集合。
  2. 判断一个变量是否是对象。值类型(undefined,number,string,boolean)的类型判断用typeof,引用类型(函数,数组,对象,null,new Number)的类型判断用instanceof。其中typeof判断引用类型只有两个结果(object/function).
  3. 对象都是函数创建的,而函数是Function创建的,Function也是函数,函数也是一种对象。
  4. 每个函数function都有一个prototype,每个对象都有一个__proto__属性,指向创建该对象的函数的prototype。__proto__指向的就是Object.prototype.但是Object.prototype却是一个特例,他的__proto__指向的是null。Object.__proto__===Function.prototype.
  5. instanceof表示的就是一种继承关系,或者原型链的结构。
  6. __proto__是任何对象都有的属性,而js是万物皆对象,所以会形成一条__proto__连起来的链条,递归访问__proto__必须最终到头,并且值为null。
  7. 访问一个对象的属性时,先在基础基本属性中查找,如果没有,再沿着__proto__这条链向上找,这就是原型链。
  8. 原型可以随时改动。
  9. JavaScript在执行一个代码片段之前,都会进行这些“准备工作”来生成执行上下文。

  10. function fn(x){
        console.log(x+5);
    }
    ===
    var fn=new Function("x","console.log(x+5)");

     

  11. 11.函数每被调用一次,都会产生一个新的执行上下文环境。函数在定义的时候(不是调用)就已经确定了函数体内部自由变量的作用域。
  12. 12.代码段分三种情况:全局代码、函数体、eval代码(不推荐使用)。
  13. 13.全局代码的上下文环境数据内容为:
    普通变量 声明(默认赋值为undefined)
    函数声明 赋值
    this 赋值
  14.  如果代码段是函数体,那么在此基础上需要附加:
    参数 赋值
    arguments 赋值
    自由变量的取值作用域 赋值
  15. 执行上下文环境:在执行代码之前,把将要用到的所有的变量都事先拿出来,有的直接赋值,有的先用undefined占个空。
  16. 执行上下文是调用函数时产生的,作用域是在函数创建时就产生的。
  17. 在函数中this到底取何值,是在函数真正被调用执行的时候确定的,函数定义的时候确定不了。
    1. 构造函数:构造函数就是用来new的对象。构造函数的首字母大写,例如Object、Array、Function等。如果函数作为构造函数用,那么其中的this代表即将new出来的对象。
    2. 函数作为对象的一个属性:如果函数作为对象的一个属性时,并且作为对象的一个属性被调用时,函数中的this指的是window。
    3. 函数用call或者apply调用:此时this的值取传入的对象的值。
    4. 全局&调用普通函数:在全局环境下,this指向window,调用普通函数,this也是指向window。
  18. 执行上下文栈:处于活动状态的执行上下文环境只有一个。这是一个压栈出栈的过程。
  19. JavaScript没有块级作用域:
    1. JavaScript除了全局作用域之外,只有函数可以创建作用域。
    2. 声明变量时,全局代码要在代码前端声明,函数中要在函数体一开始就声明好。用单var形式声明变量。
    3. 作用域有上下级的关系,上下级关系的确定就看函数是在哪个作用域下创建的。
    4. 作用域最大的用处就是隔离变量,不同作用域下同名变量不会冲突。
  20. 如果要查找一个作用域下某个变量的值,就需要找到这个作用域对应的执行上下文环境,再在其中寻找变量的值。
  21. 要在创建这个函数的那个作用域中取值----是创建而不是调用
  22. 作用域链过程:
    1. 先在当前作用域查找a,如果有则获取并结束,如果没有则继续;
    2. 如果当前作用域是全局作用域,则证明a未定义,结束;否则继续;
    3. 将创建该函数的作用域作为当前作用域;
    4. 跳转到第一步。
  23. 闭包分两种情况:
    1. 函数作为返回值
    2. 函数作为参数被传值。
      var max=10,
      fn=function(x){
          if(x>max){
              console.log(x);
              }
      };
      (function(f){var max=100;f(15);})(fn);

       

 

posted @ 2017-07-10 22:31  水迹仙涯  阅读(199)  评论(0编辑  收藏  举报