js改变做用域链

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

}

相关文章
相关标签/搜索