作用域
定义
作用域的定义:
一段程序代码中所用到的变量并不总是可用的,而限定这个变量的可用性的代码范围就是这个变量的作用域。通俗的讲,程序的作用域决定了一个变量在哪个地方能用,在哪个地方不能用。
具体讲述
关于作用域,我们就一个具体的函数来讲述。
var m = "你好";
function hello(a,b){
var name = "hello";
function world(){
var n = "world";
}
}
对于一个函数来说,作用域无非就是它所能访问变量的范围。就上面这个函数来说。函数hello所能访问或者使用的变量就是变量m、变量name、变量n以及函数的参数a、b。
简化总结为:
一个函数所能访问的变量范围就是:函数的参数、函数内的局部变量、父函数作用域的变量以及全局变量。
注意:在函数hello外不能访问或使用该函数内部定义的变量。
全局作用域和局部作用域
全局作用域
当浏览器打开页面时,会形成一个供代码执行的运行环境,这个运行环境就是全局作用域。
局部作用域
变量阴影
当某个函数中定义的变量与该函数外变量的名称相同时,函数执行的过程中会暂时用该函数局部作用域中的变量值代替局部作用域外的变量值。例子如下:
var num = 10;
function obj(){
var num = 20;
console.log(num)
}
obj();
当此函数执行时,打印的num值是20而不是10。
变量的生命周期
变量的分类
全局变量
在此理解为全局变量就是在所有函数外定义的变量。其生命周期在它被声明时初始化,在页面关闭后销毁。
注意:
在定义变量的时候,如果变量名前面没有加var,则表明该变量是全局变量。无论该变量在什么地方定义。
局部变量
在某个函数内定义的变量,只能在函数内部访问。其生命周期在它被声明时初始化,在该函数执行完毕后销毁。
作用域链
在函数嵌套中,这些函数会形成一个作用域链,而在最内部函数执行时搜索变量的时候,会先从最内部的函数本身搜索该变量,如果在该函数中不存在该变量,就会向该函数的上一级作用域中搜索,逐级递增,最后到全局作用域,如果全局作用域中搜索不到,就会报错:该变量未定义。
JavaScript在浏览器中的运行环境
当浏览器打开一个页面时,会形成一个可供代码执行的运行环境,也会形成两个虚拟的内存。分别是栈内存和堆内存。
栈内存:
提供代码运行环境,存储基本的数据类型值。存储的内容如下所示:
var num = 10;
堆内存
存储引用数据类型值。存储过程如下:
var s = {a:1}
在堆内存中开辟一个空间存放键值对,而这个空间对应一个地址,把这个十六进制的地址给存放在栈内存中的变量s。就达到了上述变量s在浏览器中的运行过程。