var str = "global";
function scopeTest(){
print(str);
var str = "local";
print(str);
}
scopeTest();
上面示例正确的输出结果:
undefined
local
分析:
例子非常有迷惑性,可以讲得更深入点。因为提到“词法作用域”,就必须得同时提到“作用域链”,两者结合才能有效理解。
对此例我的解释如下:
第1行的str(global)在定义时首先被存入作用域链的头部即全局作用域;
在调用scopeTest时,js解释器生成1个调用对象(call object),并将scopeTest内通过var定义的str设为它的一个属性,然后再把这个对象加到作用域链的最前端,通俗理解即具有最优先的访问权。
在访问str时,首先查询scopeTest的调用对象,如果从中没找到str则查询仅挨该对象的上一个作用域,以此类推直至全局作用域。
此例中从调用对象中即可查到str,因此全局对象中的str被覆盖:第3行,调用对象中有str定义但未赋值,因此为undefined;第4行,赋值;第5行,有值,所以是local。
var str = "global";
function scopeTest(){
print(str); //global
}
scopeTest();
var str = "global";
function scopeTest(){
print(str); //global
}
scopeTest();
为什么这里是global?因为scopeTest的调用对象里没有str的定义,因此必须查询全局作用域,所以得出global。
为什么“词法作用域”的效果是“函数在定义它的作用域中执行,而不是执行它的环境”?那是因为函数始终只能沿着定义它时就确定了的“作用域链”逐级访问变量,与外界执行环境无关:
var str = "global";
function scopeTest(){
alert(str);
}
(function(){
var str="aaa";
scopeTest();//global
})();
var str = "global";
function scopeTest(){
alert(str);
}
(function(){
var str="aaa";
scopeTest();//global
})();
个人理解:“词法分析”的作用是确定函数的上级作用域链,这点待求证。
分享到:
相关推荐
Javascript的词法作用域分析.pdf
深化理解javascript作用域其次篇之词法作用域和动态作用域_ 深化理解javascript作用域其次篇之词法作用域和动态作用域,是javascript中非常重要的一部分。理解词法作用域和动态作用域对javascript的编程至关重要。...
本文是深入理解javascript作用域系列第二篇——词法作用域和动态作用域 词法作用域 第一篇介绍过,编译器的第一个工作阶段叫作分词,就是把由字符组成的字符串分解成词法单元。这个概念是理解词法作用域的基础 ...
主要介绍了JavaScript词法作用域的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
Javascript函数在定义它们的作用域里运行,而不是在执行它们的作用域里运行。
主要介绍了JavaScript词法作用域与作用域链,结合实例形式分析了JavaScript词法作用域与作用域链相关概念、原理与操作注意事项,需要的朋友可以参考下
两个例子var scope= 'global scope'var scope= 'global scope'由于JavaScript采用词法作用域,函数的作用域
作用域 Scope Javascript 中的函数属于词法作用域,也就是说函数在它被定义时的作用域中运行而不是在被执行时的作用域内运行。这是犀牛书上的说法。但”定义时”和”执行(被调用)时”这两个东西有些人搞不清楚。...
以下上是我在学习和使用了JS一段时间后,为了更深入的了解它, 也为了更好的把握对它的应用, 从而在对闭包的学习过程中,自己对于词法作用域的一些理解和总结
主要介绍了JavaScript高级之词法作用域和作用域链,有需要的朋友可以参考一下
词法作用域,也叫静态作用域,它的作用域是指在词法分析阶段就确定了,不会改变。(也就是说预解析的时候就已经确定了作用域,在函数没有运行的时候就已经确定了) // 词法作用域(静态作用域) let abc = 123 function ...
是指声明的作用域是根据程序正文在编译时就确定的,也称为词法作用域。大多数现代程序设计语言都是采用静态作用域规则,JavaScript就是采用的这种作用域。 采用静态作用域的语言中,基本都是最内嵌套作用域规则:由...
JavaScript并不具有动态作用域,它只有词法作用域。词法作用域是在写代码或者说定义时确定的,而动态作用域是在运行时确定的。了解闭包前,首先我们得知道什么是词法作用域(作用域是由书写代码时函数声明的位置来...
JavaScript 的作用域包括:模块作用域,函数作用域,块作用域,词法作用域和全局作用域。 全局作用域 在任何函数、块或模块范围之外定义的变量具有全局作用域。可以在程序的任意位置访问全局变量。 当启用模块系统...