内存、变量、作用域问题

1.关于引用变量

  基本类型是指简单的数据段,引用类型是指那些可能由多个值组成的对象。

  1.关于复制变量值

  基本类型中,复制变量时,原本和副本相互独立存在,操作不会相互影响

    var n1 = 5;

    var n2 = n1;

  引用类型中,复制变量时,实际上是复制对象的引用(地址),即两个变量同时指向一个地址,此时对一个变量进行操作,另一个变量也会受到影响。

  2.关于参数传递

  实质上与复制变量相似,基本类型参数传递后,函数内部操作对外部变量没影响,但是引用变量的参数传递中,函数局部变量的变化会体现在函数的外部

  3.检测类型

  typeof  是检测变量是字符串、数字、布尔值还是undefined的最佳工具

  instanceof用来检测某个值是否是指定类型的对象

2.执行环境和作用域

1.执行环境

  全局执行环境是最外围的一个执行环境,在Web浏览器中,全局执行环境是指window对象,因此所有的全局变量和函数都是作为window对象的属性和方法创建的。

  某个执行环境所有代码执行完时,该环境会被销毁,保存在其中的所有变量和函数定义也随之销毁。(全局执行环境会在关闭网页或浏览器时才会被销毁)

  当执行流进入一个函数时,函数的环境会被推入到一个环境栈中。当函数执行后,栈将环境弹出,将控制权交还给之前的执行环境(摘自《JavaScript高级程序设计》)

2.内存中的函数对象

  1.创建函数对象时:创建两个新对象

    函数对象:函数定义

    作用域链对象:保存函数对象可用变量的位置对象,默认第一项指向window对象

  2.调用函数时:创建一个对象

    活动对象:专门保存局部变量的对象

      在作用域对象中追加对活动对象的引用

  3.函数调用完成后:

    作用域链中活动对象的引用出栈

    活动对象由于无人引用而释放

原文地址:https://www.cnblogs.com/controlms/p/7728260.html