前端笔记四 预解析、作用域、this关键字

预解析

  个人定义:js代码执行之前,会在相应的执行环境中,预先把一些东西解析到内存。

       正式执行前,解析 var function 等定义,只有变量和函数才会发生变量提升,只是提升声明不会赋值。

  预解析哪些东西: var 、function.

  预解析顺序:

    1.首先找到<script>...</script>标签,按照<script>块依次解析。不会出现跨块解析的情况。

    2.解析执行环境。首先解析的是全局作用域范围,当执行函数时,才会进入函数的解析执行环境。

    3.对标识符 var 、function 进行解析。说明function的优先级高于var。  

      function example5() {
        var f = function() {return 1;};
        function f() {return 2;};
        return f;
      }
      var a5 = example5();
      alert(a5());      //1

    解析为:   

      function example5() {
        var f; // function声明
        var f; // var声明
        f = function f() {return 2;}; // function赋值
        f = function() {return 1;}; // 等号赋值
        return f;
      }
      var a5 = example5();
      alert(a5());

  预解析通常就是我们常说的声明提前。

 

作用域: 个人理解为预解析中的解析执行环境。

  分为全局作用域、函数作用域(函数内部)、块级作用域({}大括号内部)

  注意var 属于函数作用域,let属于块级作用域。 

  //4种形式
  var a = 1;
  function fn1(){
    console.log(a);
  }
  fn1(); //输出1

  function fn1(){
    var a = 1;
  }
  fn1();
  console.log(a) //报错

  var a = 1;
  function fn1(){
    console.log(a);
    a = 2;
  }
  fn1();
  console.log(a) //输出 1,2

  var a = 1;
  function fn1(){
    console.log(a);
    var a = 2; //全局变量和局部变量同名时,全局变量的不会作用于同名局部变量的作用域
  }
  fn1();
  console.log(a) //输出 undefined, 1
 
this关键字:
  //在简单函数中使用
  function fu(){
    //"use strict"
    console.log(this); //window,严格模式下为undefined
  }
  //在对象的方法中
  var obj = {
    name: abc,
    action :function(){
      this.name; //this表示当前obj对象
    },
    msg : fu //当使用外部对象时,this不在指向window,而是obj。
  }
 
  //在构造函数中
  function Fn(name,color){
    this.name = name;
    this.color = color;
  }
  var f1 = new Fn("abc","red"); //this指向当前实例化的对象

  //改变this的指向 apply() 数组为参数,call()对象为参数 1.33分钟
  var name = "yanpin";
  var obj = {
    name: "abc",
    action:function()
    {
      console.log(this.name)
    }
  };
  console.log(obj.action.call()); //不传参数,默认window,输出name
  console.log(obj.action.call(obj)); //this指向obj

  

posted @ 2018-10-26 22:31  longshenzhu  阅读(207)  评论(0编辑  收藏  举报