预解释以及其不规则使用(1-1)

预解释

复习js的数据类型

基本数据类型

  • [ ] number
  • [ ] string
  • [ ] boolean
  • [ ] null
  • [ ] undefined

引用数据类型

  • [ ] object
  • {}
  • []
  • /^/
  • Date
  • ……
  • [ ] function

预解释的基本概念

1、当浏览器加载HTML页面时,先提供一个供全局js执行的环境–>全局作用域(global/window)

window在js中的身份

  • [ ] 全局作用域
  • [ ] 浏览器对象

2、预解释

当前作用域下,代码执行前,浏览器默认把:

  • [ ] var : 提前声明
  • [ ] function : 提前生命和定义

3、js中内存的分类

  • [ ] 栈内存:供js代码执行的环境–>作用域(全局或私有)
  • [ ] 堆内存:存储引用类型的值

图16

预解释在函数中的不规则使用

  • [x] 预解释时不管条件是否成立,都声明带var

    1
    2
    3
    4
    5
    //window的预解释:var num; ->window.num;(在执行代码前num已经存在在window中了)
    if(!("num" in window)){ // "num" in window ->true
    var num=12;
    }
    console.log(num); //undefined
  • [x] 预解释: 预解释左面 = 右面不参与预解释

    1
    2
    fn(); //-->出错(not a function)
    var fn=function(){ …… }
1
2
fn(); //-->ok
function fn(){ …… }
  • [x] 自执行函数:定义和执行一起完成;
  • 全局作用域下不进行预解释)

    1
    2
    ( function(num){} ) (100) ; //常用
    ~ function(num){} (100) ; //符号只是使得语法符合
  • [x] return 后面的不预解释和下面的预解释

    1
    2
    3
    4
    5
    6
    7
    8
    function fn(){
    console.log(num);//-->undefined
    return function(){//return后面跟着的是返回的值,所以不进行预解释
    };
    var num=100; // return下的不再执行,但是函数fn的作用域下需要预解释
    }
    fn();
  • [x] 在预解释时,不再声明已经声明过的名字,但会重新赋值;

  • (js中变量和函数的名字重复,会冲突报错)
  • [ ] 预解释过程:
  • 1、声明+定义:fn=###11111(地址1);
  • 2、声明var(不需要再声明);
  • 3、声明+定义:fn=###22222(地址2);(不再声明只定义)
  • [ ] 执行过程:
    1
    2
    3
    4
    5
    6
    7
    fn(); //--> 22222
    function fn(){console.log(11111);};
    fn(); //--> 22222
    var fn=10; //-->fn=10
    fn(); //-->10() (fn is not a function)
    function fn(){console.log(22222);};
    //总共执行2次fn();