基本类型、引用类型
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();
函数执行栈