栈内存 1 浏览器会给提供一个执行JS的环境 叫做全局作用域 私有作用域2 存储值类型
堆内存 1 存储引用数据类型 (1)对象存储多个键值对(2)函数以字符串的形式存储
解决内存过多 obj =null 浏览器会在空闲的时候把没用的占用的堆内存销毁
栈内存:1 函数执行会形成私有作用域 (栈内存) 函数执行结束栈内存就会自动释放
全局作用域会在页面关闭时候销毁
var arr=[1,2]
typeof arr 是object 所以执行也是地址引用方式 和object画原理图一致
函数操作 1 浏览器开辟一个新的堆内存 2 函数以字符串的形式存储(没有意义)3 浏览器会分配给它一个地址
函数执行 1 会形成一个新的私有作用域 把堆内存的字符串变成可执行的代码 2 函数可以执行N次啊 每次执行都是没有关系的 互不干扰
闭包 函数执行形成新的作用域 把函数中的私有变量包裹起来 和外界无关 外界无法操作变量 把函数执行形成的保护机制叫做闭包
变量提升
定义变量带var和不带var区别 带var在全局作用域下定义一个变量相当于给window对象增加一个属性
不带var 也相当于在全局作用域下定义一个变量相当于给window对象增加一个属性 【window可省略】
如果写项目 创建变量一定要带var关键词 带var有变量提升 打印undefined 不带又找不到会报错
私有作用域下区别 不带var相当于给全局增加了一个变量
函数声明和执行是不一样的 多画原理图
作用域链 如果当前没有这个私有变量 需要向上一级作用域找 如果上级没有 一直向上找扎到全局作用域window为止 这种机制是作用域链
只对等号左边 变量提升
项目中最好用函数表达式 var fn=function(){} 它等同于 function fn(){} 这两种都是变量提升
不管条件成立与否 都要变量提升
自执行函数不参与全局的变量提升 但自身是直接执行产生私有作用域 函数名undefined加()直接报错
严格模式 ‘use strict’ 代码前加这个开通严格模式 必须严格遵守语法规范 如加var
总结变量提升 1 理解 2 带var 不带的区别 3 只对等号左边的进行提升 4 不管条件成立与否都要提升 注意function(条件里面)也只是声明而不定义 5 重名情况下的处理
作用域(scope)
私有变量有两种 1 在私有作用域里定义的变量(函数) var和function关键词 2 形参也是私有变量
私有作用域执行过程 1 形参赋值 2 变量提升 3 自上而下执行 4 函数执行完销毁作用域