• 预解释


    预解释:
    是一个过程,在作用域形成之后,代码执行之前,把所有带"var"和"function"的提前声明或定义

    作用域:
    全局作用域:window下,一打开就会形成
    私有作用域:一个函数就是一个私有作用域,函数执行的时候这个作用域就会形成

    注意!全局作用域下的变量相当给window增加了一个属性
    

    声明:高速浏览器这里有一个变量,var关键字的只有声明
    定义:赋值过程,在预解释的时候function既声明还定义

    预解释的时候遇到已经声明过的就不需要再重新声明但需要重新定义
    
    console.log(obj1);
    var obj1={name:"111"};
    console.log(fn);
    function fn(){};
    //1.全局作用域形成
    //2.全局作用域下的预解释:var obj1,function fn=xxxfff000
    //3.代码执行:
    01.console.log(obj1)输出obj;Undefined
    变量只声明未定义就是Undefined
    02.obj1=xxxfff111
    03.console.log(fn);-->function fn(){}
    

    内存分为两种

    堆内存和栈内存

    堆内存就是用来存储东西的,一般都是存储应用数据类型
    栈内存就是存储"作用域"

    小练习:

    function d(){
    console.log(a)
    }
    var a=1;
    var obj={a:"bb"}
    var obj={a:"dd",b:obj.a};
    console.log(obj.a,obj.b);
    d();
    1.全局作用域形成
    2.全局下预解释:var: a和obj(第一个),function d=xxxfff000
    3.代码执行
    01.d(),函数体里面代码执行,输出Undefined(只声明未定义)
    02.a=1
    03.obj=xxxfff111(a:"bb")
    04.obj=xxxfff222(a:"dd",b:xxxfff111.a),先存储后生成地址,在存储的过程中obj指的是谁
    05.执行输出 obj.a-->"dd",obj.b-->"bb"
    06.d() 输出a=1
    

    赋值的过程是先将=等号右边的进行计算,之后再赋给左边的变量


    预解释的特殊情况

    等号右边不进行预解释(函数作为值的时候不进行预解释)

    var ff=function(){
    console.log(1)};
    

    return 下面的代码不执行但是需要的预解释,return返回出的内容执行但是不进行预解释

    function fn(){
    var a=0;
    console.log(f);// 会输出整个函数function f(){}
    return function(){
    console.log(1)};
    function f(){};}
    

    不论条件是否成立都进行与解释

    console.log(num);
    if (0){
    //虽然条件不成立 但是需要预解释
    var num=0
    }


    检测某个作用域里是不是有这个属性用"in"

    ss=0;//->window.ss=0
    console.log("ss"in window);
    

    小练习

    comsole.log(aa);
    if(!("aa"in window)){
    var aa=1;
    }
    console.log(aa)
    


    自执行函数 不进行预解释

    cosole.log(sss);
    (function sss(){
    console.log("a")})()

    
    ----------
    >预解释的时候遇到已经声明过的变量不需要声明了,但是需要定义
    >```
    >function s1(){
    >console.log("s1")}
    >function s1(){
    >console.log("s11")}
    >```
    >1.全局作用域形成
    >2.预解释var s1 ,function s1=xxxfff000,s1=xxxfff111
    >3.代码执行: s1=1
    >最后输出 1
  • 相关阅读:
    linux常用命令的英文单词缩写
    Servlet Struts2 SpringMVC 获取参数与导出数据 方法比较
    Spring 整合Mybatis Mapper动态代理方法
    Spring 整合Mybatis dao原始方法
    Mybatis Mapper动态代理方式 typeAliases 别名的使用
    MySQL 高性能优化实战总结
    Chrome 浏览器最牛插件之一 Vimium
    Spring Cloud-微服务架构集大成者
    单点登录原理与简单实现
    Spring-WebSocket 教程
  • 原文地址:https://www.cnblogs.com/Jiazexin/p/7080367.html
Copyright © 2020-2023  润新知