JS -- 高程 - chapter4( 作用域、内存 )

基本类型、引用类型


undefined、null、boolean、number、string 这五种基本类型的值是按值访问的,可以操作保存在变量中实际的值

对象( Object ) 是按引用访问的

 
当从一个变量向另一个变量赋值时,基本类型是在变量对象上 创建一个新值,然后将其放到为新变量分配的位置上,而引用类型是 复制一份对象的引用 给新的变量

基本类型
          
                基本类型

引用类型

                引用类型

 
所有函数参数传递都是 按值 传递( 引用类型传递地址 )


function setName( obj ){
  // obj 指向 person对象
  obj.name = "xxx";
  // obj 指向新的对象,不影响person对象( 按值传递 )
  obj = new Object();
  obj.name = "x";
}
var person = new Object();
setName(person);
console.log(person.name) // => "xxx"

typeof 检测变量是否是 布尔值、数值、字符串、undefined 时很有用,不适合检测引用类型的值

 

执行环境及作用域


执行环境定义了变量或函数有权访问的其他数据( 执行环境包括 变量对象、作用域链、this指向 ? )

 
每个执行环境都有一个与之关联的 变量对象 ,环境中定义的所有变量和函数都保存在这个对象中

 
每个函数都有自己的执行环境,当开始执行函数的时候,所执行的函数的执行环境会被推入一个环境栈,在函数执行完毕后,弹出该环境栈,将控制权交回上级环境栈

 
当某个环境中的所有代码执行完毕,该环境被销毁,环境中定义的变量、函数也被销毁

 
每个环境都会创建一个 变量对象作用域链 ,其作用时保证对执行环境有权访问的所有变量和函数的有序访问( 访问变量时,总是从当前执行环境开始向上层查询 ), 作用域链 的最前端始终都是当前执行环境的 变量对象

 
若执行环境是函数,则将其 活动对象 作为 变量对象,活动对象在一开始只包含一个 arguments 对象

 
函数在创建的时候执行环境就已经被创建了,并且确定了 作用域链,创建了变量对象,但此时变量对象中只有 arguments 一个变量,在函数执行的时候,变量对象转换为活动对象,并添加函数中的变量和函数,以及确定 this 的指向


function foo(a){
  var b = 10;
  var c = 20;
  function bar(){
    console.log(c);
  }
}

 
                    作用域链


作用域链

 

function foo(){
  function bar(){
  }
  return bar;
}
var bar = foo();
bar();

 
                     函数执行栈


函数执行栈

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值