第4章 变量、作用域和内存问题

50 阅读2分钟

基本类型和引用类型的值

传递参数

传参如果是基本数据类型,则复制一个值传给内部参数(局部变量)。当改变了函数内部的参数,不会影响到外面原本的值。(副本改变)

参数是函数的局部变量。

引用类型做参数传递给函数内部,该引用类型是全局对象。也就是说,如果传给函数的参数是一个对象,那么在函数中改变了这个对象的属性,在函数外部的对象的属性也跟着改变了。原理就是把函数外面的对象传给函数,只是复制了一个指针,该指针指向的是函数外面的对象。所以只有函数内部的参数对象改变属性,相当于是给外部的对象做了属性修改,也就是修改的是同一个对象。

检测类型

variable instanceof constructor 变量是否为构造函数的实例对象

function fn(params) {
  
}
console.log(
  null instanceof Object, // false
  [] instanceof Object, // true
  fn instanceof Object, // true
  fn instanceof Function, // true
);

执行环境及作用域

执行环境有个变量对象(veritable object),环境中定义的所有变量和函数都保存在这个对象中

某个执行环境中的所有代码执行完毕后,该环境被销毁,保存在其中的所有变量和函数定义也随之销毁。

全局执行环境直到应用程序退出,关闭网页或关闭浏览器才会被销毁

代码在一个环境中执行时,就会创建一个作用域链(scope chain)。

作用域链的作用是,当同时有权访问多个作用域的变量和函数时,明确访问的优先顺序。

作用域链的前端,始终是当前执行的代码所在环境的变量对象;下一个变量对象是包含环境;再下一个变量对象是再下一个包含环境。由此推进,最后延续到全局执行环境。

全局执行环境的变量对象,始终是作用域链中的最后一个对象。

内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境中的任何变量和函数。

没有块级作用域

用if和for循环时,花括号并没有形成作用域。导致在if里面声明变量,这个变量会被添加到当前执行环境中,也就是if的外层,可能是全局环境。