zoukankan      html  css  js  c++  java
  • javascript代码解释执行过程

    javascript是由浏览器解释执行的脚本语言,不同于java c,需要先编译后运行,javascript 由浏览器js解释器进行解释执行,总的过程分为两大块,预编译期和执行期

    下面的几个demo解释了js解释器对变量和代码的解释过程

    //#demo1
    foo();//alert(1)
    function foo(){//声明式函数
      alert(1);
    }
    foo2();//undefined is not a function 
    var foo2 = function(){//赋值式函数声明,其实是函数表达式
      alert("foo2");
    };
    //#demo2
    alert(str);//undefined
    var str="str";
    alert(str);//str

    js执行过程分为预编译期和执行期(以代码块为单位,边解释边执行),在预编译期,js解释器会对本代码段内所有的 声明的变量和方法进行处理,将变量和方法提到对应的作用域的最前面,该过程只是对变量进行声明,并不会进行初始化或者赋值(缺省值默认为undefined)

    //#demo1中声明式函数与赋值式函数区别在于 声明式函数会在预编译期被整体提到作用域前面,所以其实#demo1经过预编译后代码如下:

    var foo2; //缺省值是'undefined'
    function foo(){
     alert(1);
    }
     foo();
    foo2();//undefined is not a function 
    foo2 = function(){
      alert('foo2');
    };

    JavaScript 中局部变量只可能通过两种方式声明,一个是作为函数参数,另一个是通过 var 关键字声明。 var 表达式和 function 声明都将会被提升到当前作用域的顶部,看一下#demo3

    bar();
    var bar = function() {};
    var someValue = 42;
    
    test();
    function test(data) {
        if (false) {
            goo = 1;
    
        } else {
            var goo = 2;
        }
        for(var i = 0; i < 100; i++) {
            var e = data[i];
        }
    }

    上面代码在运行之前将会被转化。JavaScript 将会把 var 表达式和 function 声明提升到当前作用域的顶部。

    var bar,someValue;
    function test(data){
      var goo,i,e;
      if(false){
        goo = 1;
      } else{
        goo = 2;
      }
      for(i=0;i<100;i++){
        e = data[i];
      }
    }
    bar();//undefined
    bar = function(){};
    someValue = 42;
    test();

    当访问函数内的 goo 变量时,JavaScript 会按照下面顺序查找:

    1.当前作用域内是否有 var goo的定义。 2.函数形式参数是否有使用 goo名称的。 3.函数自身是否叫做 goo。 4.回溯到上一级作用域,然后从 #1 重新开始

  • 相关阅读:
    动态规划算法介绍——概念、意义及应用、例题
    两个大数相减
    删除apache的签名的shell脚本
    C++中智能指针的设计和使用
    eclipse save action不起作用
    [leetcode]51. N-QueensN皇后
    [leetcode]33. Search in Rotated Sorted Array旋转过有序数组里找目标值
    [leetcode]88. Merge Sorted Array归并有序数组
    [leetcode]636. Exclusive Time of Functions函数独占时间
    [leetcode]257. Binary Tree Paths二叉树路径
  • 原文地址:https://www.cnblogs.com/liangdong/p/10006096.html
Copyright © 2011-2022 走看看