js作用域和词法分析
都知道js中不存在类似于c++等语言的块级作用域,例如for循环中定义的变量,其实是属于当前对象下的属性,同一对象下可以随便访问。 只有函数可以限定一个变量的作用范围,即函数才是变量的作用域。 对于函数的变量访问时遵循作用域链的,即当前函数运行时会有一个当前作用域,当饮用某个变量时,会先查找当前作用域内是否存在该变量的定义,如果不存在则根据作用域链向上去查找父函数的作用域,有则拿来使用,没有则继续向上直到全局作用域。关于作用域链这里就不仔细描述,简单而言,类似原型链,从全局函数直到当前函数的作用域存在一种相互包含的关系,子可以向上访问,但是父不可以向下访问子函数的变量,这样层层嵌套的关系链。 类似这样的: var num = 10; function a (){ alert(num); } a() //结果alert(10),a里没有num所以向上查找外层的作用域,有且等于10所以弹出10而不是undefined. 但是,下面的代码就是undefined了: var num = 10; var num = 10; function a (){ alert(num); var num = 11; } 为什么呢? a()执行时虽然num=11没有赋值但是父级作用域里是有num=10的,不应该是 undefined呀