zoukankan      html  css  js  c++  java
  • javascript中的预解释(变量提升)

    当浏览器开始加载我们HTML页面的时候,首先会提供一个供js代码执行的环境--->window全局作用域,在window全局作用域下定义的变量-->全局变量,在当前作用域中,js代码从上到下执行之前,浏览器会默认的 先把所有带var和function关键字的进行提前的声明或者定义--->预解释(变量提升)
    带var关键字的和带function关键字的在预解释的时候是不太一样的
    ①var:预解释的时候只提前的声明,在代码执行的过程中才定义赋值
    ②function:预解释的时候声明+定义都完成了(这也是为什么函数可以把调用写到定义前面的原因)


    关于预解释的6条规律
    预解释是毫无节操的一种机制:
    1、不管条件是否成立都会进行预解释
    if (!("a" in window)) {//"a" in window -->true 取反为false,条件不成立
    var a = 1;
    }
    console.log(a);//-->undefined

    2、只对"="左边的进行预解释,右边的是值,不进行预解释
    fn();//Error:fn is not a function
    var fn = function () {
    console.log(1);
    };
    fn();

    3、自执行函数不进行预解释(window下不对自执行函数进行预解释;) 

    ;(function (num) {//执行的时候形成一个私有的作用域,在私有的作用域中要进行预解释
    })(100);

    4、函数体中return 后面的返回值不进行预解释,但是下面的代码,虽然不执行,但是要进行预解释
    function fn() {
    //私有作用域下的预解释:
    var num;
    return function () {}; //在函数体中return下面的语句都不在执行了
    var num = 12;//会进行预解释
    }
    fn();
    5、预解释只对同一个脚本块(<script></script>)起作用
    6、如果预解释的时候发现重名了,不重新的声明,但是需要重新的定义
     fn = function(){alert(3)}
    fn();
    function fn() {
    alert(1);
    }
    var fn;
    fn();
    function fn() {
    alert(2);
    }
    fn();
    var fn = 13;//-->fn=13
    function fn() {
    alert(3);
    }
    fn();//-->13() Error:fn is not a function
     
     
     
     
  • 相关阅读:
    教你怎样做个有“钱”途的測试project师
    使用具体解释及源代码解析Android中的Adapter、BaseAdapter、ArrayAdapter、SimpleAdapter和SimpleCursorAdapter
    html-上左右布局方式---ShinePans
    POJ1502 MPI Maelstrom Dijkstra
    Angry IP Scanner 获取设备的IP
    【Struts2学习笔记(12)】Struts2国际化
    使用SQL Profile及SQL Tuning Advisor固定运行计划
    sage开发url替换字符串
    柯塔娜大合唱,互联网安全观
    vim水平摆放全部窗体的三个方法
  • 原文地址:https://www.cnblogs.com/jingjing0518/p/4756163.html
Copyright © 2011-2022 走看看