一般而言数据的存储位置关系到代码执行过程中数据的检索速度,改变数据的存储位置可以获得程序的最佳读写性能。
在JS中访问数组元素和对象成员的代价要高于字符串、数字、布尔值以及开发人使用关键字var 定义的局部变量。
首先要明确作用域的的概念是指变量与函数的可访问范围。
JS中每个对象拥有可编程访问的属性以及不能通过编程访问而只能通过JS引擎访问的内部属性。
1.其中一个内部属性就是[[Scope]],这个属性包含了函数被创建时的作用域对象的集合,及记录了该函数可以访问哪些变量的集合,该集合也叫作函数的作用域链。
当对象被创建时,该函数可以访问哪些变量哪些数据被记录在了这个属性中。包括全局对象以及全局范围内定义的变量,例如 window,navigator和document等。以及函数参数等函数内部可以访问的变量。
2.第二个是当函数执行时会创建另外一个内部对象,称为执行环境对象。一个执行环境定义了一个函数执行时的环境。
它有两个主要特点:函数每次执行所对应的执行环境都是独一无二的;多次调用同一个函数会创建多个执行环境对象;
1与2的关系是,每个执行环境都有自己的作用域链,用于解析标识符,当执行环境对象被创建时(即函数执行时),它的作用域链对象初始化为当前函数的[[Scope]]属性中的对象。
按照它们出现在函数中的顺序被复制到执行环境的作用域链中。函数执行时会创建一个活动对象,该对象包括该函数的形参以及实参及内部声明的变量和函数,并插队到作用域链的最前端。
在函数执行过程中,每遇到一个变量都要进行一次标识符查找过程。从执行环境对象的作用域链开始查找同名的标识符。从作用域链头部开始,即先从插队到顶部的活动对象然后才是函数的作用域链对象的查找顺序。
总结: 一个标识符所在的位置越深,它的读写速度越慢。函数读写局部变量最快,读取全局变量最慢。ps 可以缓存全局变量到局部变量中,加快变量读取速度!