zoukankan      html  css  js  c++  java
  • js的预编译机制

     

    1.var定义的是“当前作用域下的一个变量”,当在函数内部不使用var声明时,会被当做全局变量而不是函数内的局部变量(严格模式下还会报错)

    2.js的预编辑:【对定义式函数】直接创建为作用域上的函数变量,并将其值初始化为定义的函数代码逻辑,也就是为其建立了可调用的函数变量。

    3.js的预编辑:【对var定义的变量】 会在开始先全部找出来,并且将初始值设为undefined

    4.【对上面代码的解释】:第一个yournameundefined:js开始解析时获得了第一行的yourname声明和函数内部的yourname声明,也就是说在函数内部的局部变量里yourname是被声明过的,然后他们被赋予undefined(等待进一步赋值),然而在函数内部时调用在前赋值在后,所以显示的是undefined

    5.最后一行仍然是“李战”:js倾向于先在当前作用域中找函数或变量,如果没有的话再到上层去找,以此类推

    最后贴几个很好的例子:

     1     alert(testNum);  
     2     alert('ok');  
     3     testNum = 2;  
     4     //testNum未声明,执行报错。  
     5     alert(testNum);  
     6     alert('ok');  
     7     var testNum = 2;  
     8     //弹出undefined和ok。预编译的时候,声明了变量t;执行到alert(t)这行代码的时候,t尚未被赋值,所以弹出undefined。  
     9     testFunc();  
    10     function testFunc() {}  
    11     alert('ok');  
    12     //弹出ok。预编译的时候,解析了定义式函数语句function testFunc() {},顺利执行。  
    13     testFunc();  
    14     var testFunc = function() {};  
    15     alert('ok');  
    16     //testFunc不是函数,执行报错。预编译的时候,声明了变量testFunc = undefined;执行到testFunc()时,testFunc还等于undefined,不是函数,所以执行testFunc()会报错。  
    17 
    1819 
    20     <script type="text/javascript">  
    21     testFunc();  
    22     alert('first block');  
    23     <!--script-->  
    24     <script type="text/javascript">  
    25     alert('second block');  
    26     <!--script-->  
    27     //弹出second block。因为JS是一段一段执行的,第一段执行到testFunc()的时候报错,整个第一段都不会再执行,第二段正常执行。 
    28 
    29  
  • 相关阅读:
    BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊
    算法笔记-- 二进制集合枚举子集 && 求子集和 && 求父集和
    BZOJ 1084: [SCOI2005]最大子矩阵
    BZOJ 1968: [Ahoi2005]COMMON 约数研究
    2018 German Collegiate Programming Contest (GCPC 18)
    Codeforces 1100 F
    算法笔记--极大极小搜索及alpha-beta剪枝
    2017 Russian Code Cup (RCC 17), Elimination Round D
    All You Can Code 2008 (Romanian Contest) A
    2016 Russian Code Cup (RCC 16), Final Round B
  • 原文地址:https://www.cnblogs.com/xisitan/p/4318718.html
Copyright © 2011-2022 走看看