作用:生效,可以使用
域:范围
一个东西可以生效的范围什么东西?变量(变量名,函数名)其实就是一个变量可以生效的范围一个html页面就是一个全局作用域
打开页面的时候,作用域就生成了,直到页面关闭为止
每一个函数就是一个私有作用域
全局作用域最大,所有私有作用域都是在全局作用域下面的
函数生成的私有作用域,函数写在哪个作用域里面,就是哪个作用域的子集
// 这个位置就是全局作用域 function fn() { // 这个位置就是 全局作用域的一个叫做 fn 的子级作用域 function fun() { // 这个位置就是 全局下的 fn 私有作用域下的 fun 私有作用域 } }变量定义规则
变量使用规则
变量复制规则
当你在定义一个变量的时候
你把这个变量定义在哪个作用域里面
就只有这个作用域及其后代作用域可以使用
当前作用域的所有祖先级作用域不能使用
// 全局作用域里面的变量 a var a = 100 function fn() { var b = 200 // fn 私有作用域里面的变量 b function fun() { var c = 300 // fun 私有作用域里面的变量 c } }当你需要使用一个变量的时候
首先,在自己作用域内部查找
如果有:就直接使用,停止查找
如果没有,就去上一级作用域查找,有就使用,停止查找
如果还没有,就再去上一级作用域查找,有就使用,停止查找
直到全局作用域都没有,那么就报错 “变量 is not defined”
var a = 100 function fn() { var a = 'fn 里面的' var b = 200 function fun() { var a = 'fun 里面的 a 变量' var b = 'fun 里面的' var c = 300 console.log(d) // 报错:d is not defined } fun() } fn()当你需要给一个变量赋值的时候
先在自己作用域内部查找
如果有,就给自己作用域内部的变量赋值
如果没有,就向上一级查找,如果有就给父级的变量赋值
如果还没有,就继续向上查找,直到全局作用域都没有,那么就把这个变量定义为全局变量,再进行赋值
var a = 100 // 全局 a 变量 function fn() { a = '后来赋值操作' console.log(a) // 后来赋值操作 } fn() // 因为 fn 函数的执行, 给全局变量 a 从新进行了赋值操作 console.log(a) // 后来赋值操作 var a = 100 // 全局 a 变量 function fn() { var a = 200 // fn 私有变量 a a = '后来赋值操作' console.log(a) // 后来赋值操作 } fn() console.log(a) // 100