js改变作用域链

js有两种作用域:全局和局部

在最外层定义的变量拥有全局作用域,对任何内部函数来说,都是可以访问的;而局部作用域则只有内部函数定义的变量才拥有;在函数内部定义变量时,要使用var,否则定义的变量时全局变量

js是没有块级作用域的,因此for循环中的i在执行完循环后,还可以被同作用域的代码获取。js的作用域都是相对于函数而言,是函数作用域。

js的作用域链:

每个函数执行都会生成一个执行环境,全局执行环境是最外围的执行环境且被认为是window对象,因此所有全局变量和函数都会作为window对象的属性和方法而被创建;当一个函数被调用时,该函数环境的变量对象就会被压入一个环境栈中。而在函数执行之后,栈将该函数的变量对象弹出,把控制权交给之前的执行环境变量对象

js如何来延长作用域链:

有三种语句可以加强作用域链:try catch;with;eval

trycatch中的catch和with语句都会在作用域链的前端添加一个变量对象。对with语句来说,将指定的对象添加到作用域链中,对catch语句来说,会创建一个新的变量对象,其中包含的是被抛出的错误对象的声明,而eval由于可以被赋值给变量,在被赋值的时候会将eval所处的变量作用域也赋值过去,所以可以使得作用域获得扩展。

eg:

var x=1,evalg=eval;

function a(){

  var x=3;

  eval("alert(x)");//3

  evalg("alert(x)");//1

}

原文地址:https://www.cnblogs.com/runhua/p/9576427.html