最近面试的时候有人问我对范围链的理解,我当时觉得答案不是很好。今天,我们来谈谈js中的范围链。
首先,我们来谈谈js中的执行环境。所谓的执行环境(有时也叫环境)是JavaScript中最重要的概念。执行环境定义变量或函数可以访问的其他数据,并确定它们各自的行为。每个执行环境都有一个与之相关的变量对象,环境中定义的所有变量和函数都存储在这个对象中。
了解了执行环境之后,我们再来看看什么是范围链。每个函数都有自己的执行环境,当代码在执行环境中执行时,就会创建变量对象的作用域链。范围链确保对执行环境有权访问的所有变量和函数的有序访问。范围链的前端始终是当前执行代码所在环境的变量对象。如果环境是一个函数,它的变量对象就是函数的活动对象。作用域链的下一个变量对象来自包含(外部)环境,下一个变量对象来自下一个包含环境。这一直延续到全局执行环境,记住全局执行环境的变量对象始终是作用域中的最后一个对象。
请参见以下示例:
var作用域=“全局”;function foo(){ console.log(作用域);} foo();在本例中,函数foo()的作用域链包含两个对象,一个是它自己的对象,另一个是全局环境中的变量对象。因为我们可以在这个范围链中找到范围,所以我们可以在函数内部访问它。
看一个例子:
var color=' blue函数change color(){ var anoterColor=' red ';函数swapColor(){ var tempColor=anoterColor;anoterColor=colorcolor=tempColorconsole.log(颜色);} swapColor();} ChangeColor();在这个例子中,有三个执行环境:全局环境、changeColor()的本地环境和swapColor()的本地环境。让我们看看这个例子中的范围链。
图中的矩形表示特定的执行环境。我们可以看到,变量tempColor只能在swapColor()环境中访问,但它不能在changeColor()的本地环境或全局环境中访问。因此,我们可以得出一个结论:内部环境可以通过范围链访问所有外部环境,但外部环境不能访问内部环境中的任何变量和函数。每个环境都可以搜索范围链来查询变量和函数名;但是,任何环境都不能通过向下搜索范围来进入另一个执行环境。
我还想谈谈范围:js没有块级范围。
为什么js没有块级作用域?让我们看看下面的代码:
if(true){ var color=' blue ';}alert(颜色);//'蓝色'嘿,为什么执行if语句后颜色被破坏了?哈哈,如果在c,c或者Java中,颜色会被破坏,但是在JavaScript中,if语句中的变量声明会将变量添加到当前的执行环境中(这种情况下是全局环境)。特别是,在做for语句时,请记住这一区别,例如:
for(var I=0;i 10I){ DosMexing(I);} alert(I);//10请记住:在JavaScript中,我用for语句创建的变量即使在for循环执行完毕后,也仍然会存在于for循环之外的执行环境中。
以上就是本文的全部内容,希望对大家的学习有所帮助。