js有两种做用域:全局和局部前端
在最外层定义的变量拥有全局做用域,对任何内部函数来讲,都是能够访问的;而局部做用域则只有内部函数定义的变量才拥有;在函数内部定义变量时,要使用var,不然定义的变量时全局变量函数
js是没有块级做用域的,所以for循环中的i在执行完循环后,还能够被同做用域的代码获取。js的做用域都是相对于函数而言,是函数做用域。对象
js的做用域链:作用域
每一个函数执行都会生成一个执行环境,全局执行环境是最外围的执行环境且被认为是window对象,所以全部全局变量和函数都会做为window对象的属性和方法而被建立;当一个函数被调用时,该函数环境的变量对象就会被压入一个环境栈中。而在函数执行以后,栈将该函数的变量对象弹出,把控制权交给以前的执行环境变量对象it
js如何来延长做用域链:io
有三种语句能够增强做用域链:try catch;with;evalfor循环
trycatch中的catch和with语句都会在做用域链的前端添加一个变量对象。对with语句来讲,将指定的对象添加到做用域链中,对catch语句来讲,会建立一个新的变量对象,其中包含的是被抛出的错误对象的声明,而eval因为能够被赋值给变量,在被赋值的时候会将eval所处的变量做用域也赋值过去,因此能够使得做用域得到扩展。function
eg:变量
var x=1,evalg=eval;扩展
function a(){
var x=3;
eval("alert(x)");//3
evalg("alert(x)");//1
}