• Javascript预编译和执行过程


    1. 在执行前会进行类似“预编译”的操作:首先会创建一个当前执行环境下的活动对象,并将那些用var申明的变量设置为活动对象的属性,但是此时这些变量的赋值都是undefined并将那些以function定义的函数也添加为活动对象的属性,而且它们的值正是函数的定义。

    2.在解释执行阶段,遇到变量需要解析时,会首先从当前执行环境的活动对象中查找,如果没有找到而且该执行环境的拥有者有prototype属性时则会从prototype链中查找,否则将会按照作用域链查找。遇到var a = ...这样的语句时会给相应的变量进行赋值(注意:变量的赋值是在解释执行阶段完成的,如果在这之前使用变量,它的值会是undefined)

    根据以上说明的一些测试:
    <script type="text/javascript">
    alert(myName); //undefined 
    var myName = "hong"; 
    alert(myName); //hong 
    </script>

    <script type="text/javascript">
    func(); //hello
    function func(){
      alert("hello!")
    }
    </script>

    <script type="text/javascript">
    /*在预编译过程中func是window环境下的活动对象中的一个属性,值是一个函数,覆盖了undefined值*/
    alert(func); //function func
    var func = "this is a variable"
    function func(){
      alert("hello!")
    }
    /*在执行过程中遇到了var重新赋值为"this is a variable"*/
    alert(func); //this is a variable
    </script>
     

    <script type="text/javascript">
    /*在预编译过程中func是window环境下的活动对象中的一个属性,值是一个函数,覆盖了undefined值*/
    alert(func); //function func


    alert(func()); // abc
    var func = "this is a variable";
    alert(dd);
    function func(){
      alert("hello!")
    return 'abc';
    }
    function dd(){

    }
    alert(window.abc);
    window.abc=function cde(){
    alert('aaaaa');
    };
    alert(window.abc);
    alert(window.abc());
    /*在执行过程中遇到了var重新赋值为"this is a variable"*/
    alert(func); //this is a variable
    alert(func());//会报错,此时是一个变量Sring值
    </script>


    <script type="text/javascript">
    var name = "hong";
    function func(){
      /*首先,在func环境内先把name赋值为undefined,然后在执行过程中先寻找func环境下的活动对象的name属性,此时之前已经预编译值为undefined,所以输出是undefined,而不    是hong*/
      alert(name); //undefined
      var name = "JSF";
      alert(name); //JSF
    }
    func();
    alert(name); //hong
    </script>
     
  • 相关阅读:
    【mongoDB】mongoDB设置权限登陆,并且在keystonejs中创建新的数据路连接实例
    【mongoDB】mongoDb设置权限配置
    【CSS】css改变select选择框的样式
    【原生js】js动态添加dom,如何绑定事件
    【原生js】原生js实现验证码短信发送倒计时
    【jQuery、原生】键盘键入两位小数
    web前端入门
    【原生js】原生js的省市区三级联动
    vue2
    js profiler
  • 原文地址:https://www.cnblogs.com/xz1367/p/2319651.html
Copyright © 2020-2023  润新知