JS中所有的函数的参数都是按值传递
- 原始值(基本数据类型)是按照值传递
- 引用值(引用数据类型)是按照共享传递(如果直接说按值传递,指的是传递的引用类型的指针地址 | 对象的引用的副本)
参考:https://segmentfault.com/a/1190000005794070
传递方式:
- 按值传递
- 按引用传递
- 按共享传递
执行上下文与作用域
执行上下文:
- 全局执行上下文
- 函数执行上下文
- eval执行上下文
作用域里链:
上下文代码执行时,会创建一个变量对象的作用域链(scope chain),这个作用域链决定了各级上下文中的代码在访问变量和函数时的顺序。当需要访问一个变量时,会先搜索当前作用域的变量时候存在,如果没有找到,向外搜索包含上下文,一直搜索到全局的上下文为止,找到则返回该变量,如果没有找到,则返回undefined
变量声明
- var:视为最近的上下文:函数、with语句 ==> 函数上下文
- var 声明的变量存在“提升”(hositing)
- 未声明而初始化 ==>全局上下文
- let: 块级作用域:if 块、while块、function块、{} ==> 只能在块内访问,块外无法访问
- “暂时性死区”(temporak dead zone): 无法在let 声明的变量之前访问他
- const:块级作用域,已经初始化,无法重新赋予新值
- 如果声明的是对象,保存的是对象的指针,不能改变的也是指针,但对象的键值仍然可以更改,如果要求对象里面的键值也不能修改,可以使用 Object.freeze()
const noChangeObj = Object.freeze({name: 'wuyanbin'})
noChangeObj.name = 'hahah'; // 不会报错,静默失败
noChangeObj.age = '27'; // 不会报错,静默失败
垃圾回收
- 如果声明的是对象,保存的是对象的指针,不能改变的也是指针,但对象的键值仍然可以更改,如果要求对象里面的键值也不能修改,可以使用 Object.freeze()