在《javascript权威指南》中有一句“javascript中的函数是通过词法来划分作用域的,而不是动态的划分作用域的。这意味着,它们在定义它们的作用于运行,而不是在执行它们的作用域里运行。”这句话精辟,但又很难理解。下面讲讲我的看法。
在javascript中一个函数的执行涉及到词法作用域、执行环境、活动对象、作用域链。(这3者的关系见附件图)。
具体的讲一个函数的执行涉及到2个步骤。
1、词法分析阶段。
2、执行阶段。
词法分析阶段已经将所有相应的源代码分析成语法树,构建词法作用域。
执行阶段将构建函数执行环境、相应的调用对象。并且将词法分析阶段所获取的信息添加至执行环境中,而获取作用域链。
举例说明:
function f(x) {
var g = function () { return x; }
return g;
}
var g1 = f(1);
var g2 = f(2);
alert(g1()); //输出 1
alert(g2()); //输出 2
在词法分析阶段,已经成生
var SyntaxTree={
window:{
g1:{value:f(1)},
g2:{value:f(2)}
},
functions:{
f:this.f,
},
f:{
variables:{x:'undefined'},
functions{g:this.g},
scope:this.window //在词法分析阶段已经将所属环境确定下来了,所以 //以后任何地方调用,都是按定义的时候走。
}
g:{
variables:{},
scope:this.f
}
}
执行阶段:
待续。。。。。
================
写累了,休息一下。也不知道有没有人看。
- 大小: 40.9 KB
分享到:
相关推荐
主要介绍了JavaScript词法作用域的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
Javascript的词法作用域分析.pdf
Javascript函数在定义它们的作用域里运行,而不是在执行它们的作用域里运行。
深化理解javascript作用域其次篇之词法作用域和动态作用域_.docx
作用域 Scope Javascript 中的函数属于词法作用域,也就是说函数在它被定义时的作用域中运行而不是在被执行时的作用域内运行。这是犀牛书上的说法。但”定义时”和”执行(被调用)时”这两个东西有些人搞不清楚。...
本文是深入理解javascript作用域系列第二篇——词法作用域和动态作用域 词法作用域 第一篇介绍过,编译器的第一个工作阶段叫作分词,就是把由字符组成的字符串分解成词法单元。这个概念是理解词法作用域的基础 ...
以下上是我在学习和使用了JS一段时间后,为了更深入的了解它, 也为了更好的把握对它的应用, 从而在对闭包的学习过程中,自己对于词法作用域的一些理解和总结
主要介绍了JavaScript词法作用域与作用域链,结合实例形式分析了JavaScript词法作用域与作用域链相关概念、原理与操作注意事项,需要的朋友可以参考下
两个例子var scope= 'global scope'var scope= 'global scope'由于JavaScript采用词法作用域,函数的作用域
主要介绍了JavaScript高级之词法作用域和作用域链,有需要的朋友可以参考一下
词法作用域,也叫静态作用域,它的作用域是指在词法分析阶段就确定了,不会改变。(也就是说预解析的时候就已经确定了作用域,在函数没有运行的时候就已经确定了) // 词法作用域(静态作用域) let abc = 123 function ...
是指声明的作用域是根据程序正文在编译时就确定的,也称为词法作用域。大多数现代程序设计语言都是采用静态作用域规则,JavaScript就是采用的这种作用域。 采用静态作用域的语言中,基本都是最内嵌套作用域规则:由...
JavaScript并不具有动态作用域,它只有词法作用域。词法作用域是在写代码或者说定义时确定的,而动态作用域是在运行时确定的。了解闭包前,首先我们得知道什么是词法作用域(作用域是由书写代码时函数声明的位置来...
JavaScript 的作用域包括:模块作用域,函数作用域,块作用域,词法作用域和全局作用域。 全局作用域 在任何函数、块或模块范围之外定义的变量具有全局作用域。可以在程序的任意位置访问全局变量。 当启用模块系统...