js改变作用域链
Posted 某个润滑君
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
}
以上是关于js改变作用域链的主要内容,如果未能解决你的问题,请参考以下文章