一。javascript的预编译
javascript是完全静态的么?
不是。也就是说javascript并不是简单的按照代码一行一行挨个往下执行。
对于解释执行语言,肯定不会编译成什么中间语言。大概过程如下:
#1 建立全局对象
为执行环境(一个html页面,框架环境下有几个执行环境)建立建立一个全局对象,一般客户端脚本为 window或global对象。(在这我觉得global好理解,因为浏览器会放入window和其他的属性)
#2 检查根对象的全局var变量,设置为全局对象的属性,属性值为undefined
检查某环境中根代码块中(非函数中,非{}中)var关键字,把这些变量设置成global对象的属性,并附初值为:undefined;
注意:没有var修饰的就略过去了;
注意:这里仅仅是预编译,这些var变量的真正初值需要执行到代码行时才定下来;也就是说未执行至真正的初值初始化行时,这些属性值一直为undefined
#3 检查全局函数,设置为全局对象的属性,并初始化
如果过程中遇到直接定义的函数(function的定义),设置成global对象的属性,并附初值函数的定义。
注意:这里真正的初始化了!不同于#2.
再强调一次,这里只是类似的预编译,相当于c语言中的原型定义,方便后面调用,这些预编译的东西并不执行,也不检查错误,并不是java中的预编译。
二。 以函数作为变量作用域的分界
java等语言中以块来区分变量的作用域,但javascript中没有块作用域,只有函数作用域。
也就是说,函数内同时不在嵌套的函数内,的变量都是在一个作用域中,不管是在块内还是块外。
三。词法作用域
有个疑问,为啥javascript没有一个官方的文档,说清楚这些东西是怎么回事。《javascript权威编程》《javascript权威指南》好像是顶级的书了,但看看,连个变量也没说清楚。
整个一个乱象,谁想怎么实现就怎么实现,谁想怎么处理就怎么处理。这些逻辑好像都是试出来的,有多少还没有试出来,谁知道!
程序员浪费时间搞这些事情,真是一种浪费呀!
K
-
K
-
K
-
K
分享到:
相关推荐
在JavaScript中,执行环境的概念至关重要,因为它不仅涉及到变量的作用域,还关系到内存管理以及代码执行的流程。 每个执行环境都与一个变量对象相联系,该对象存储了环境中定义的所有变量和函数。虽然开发者无法...
在JavaScript的世界里,作用域是理解代码执行和变量生命周期的关键概念。作用域决定了变量在哪里可以被访问,以及它们的生命周期如何管理。 首先,我们要了解JavaScript中的两种基本作用域:全局作用域和局部作用域...
JavaScript 课程内容总结 JavaScript 是一种广泛应用于网页开发的编程语言,...JavaScript 中的作用域包括全局变量和局部变量。全局变量定义在函数外部,作用于整个脚本。局部变量定义在函数内部,只能在函数中使用。
2. 作用域:JavaScript中的变量作用域有全局作用域和局部作用域,以及ES6引入的块级作用域。理解作用域规则能避免很多潜在问题。 3. 函数:函数是可重用的代码块,可以有参数和返回值。了解函数表达式、函数声明、...
var声明的变量有变量提升的特性,即在JavaScript代码执行前,var声明的变量会被提升到当前作用域的最顶部,但声明的值不会被提升。这导致如果在声明之前访问变量,结果将是undefined。这种特性在JavaScript早期版本...
这篇博客“JavaScript 面向对象编程小结”可能涵盖了JavaScript中实现OOP的一些核心概念和技巧。 首先,面向对象编程的基础是类与对象。在JavaScript中,虽然没有像Java或C++那样的传统类机制,但是可以通过构造...
在JavaScript这种弱类型语言中,开发者经常会遇到一些陷阱,这些陷阱主要涉及到变量、函数、数组、对象以及作用域等方面。以下是对这些知识点的详细解释和实例分析: 1. **变量提升(Hoisting)** 在JavaScript中...
作用域是指在JavaScript中变量、函数和对象的可见性范围。主要有全局作用域和局部作用域。全局作用域的变量在整个脚本中都可访问,而局部作用域的变量仅在其定义的函数内部可见。 2. 闭包的概念 闭包是一种特殊的...
在JavaScript中,每次在局部作用域内查找变量时,都需要沿着作用域链向上查找,直到找到变量所在的定义位置。如果频繁使用全局变量,这会导致大量的查找操作,降低执行效率。为优化这一点,可以将全局变量导入到局部...
1.避免使用eval或者Function构造函数 2.避免使用with 3.不要在性能要求关键的函数中使用try-catch-finally 4....在当前作用域存储应用的外部变量 13.使用变量缓存值 1.避免使用eval或者Function构造函数 使用
第4章 变量、作用域与内存 83 4.1 原始值与引用值 83 4.2 执行上下文与作用域 87 4.3 垃圾回收 94 4.4 小结 101 第5章 基本引用类型 103 5.1 Date 103 5.2 RegExp 107 5.3 原始值包装类型 113 5.4 单例...
3.10 变量作用域56 第4章 表达式和运算符60 4.1 原始表达式60 4.2 对象和数组的初始化表达式61 4.3 函数定义表达式62 4.4 属性访问表达式63 4.5 调用表达式64 4.6 对象创建表达式64 4.7 运算符...
使用var声明的变量具有函数作用域或全局作用域,而let和const声明的变量具有块级作用域。let和const声明的变量是不允许重复声明的,而var声明的变量是可以重复声明的。let和const为JavaScript提供了更多的变量管理...
作用域在JavaScript中分为全局作用域和函数作用域,而函数作用域内嵌套的函数便可以形成闭包。闭包的主要特性是函数嵌套函数、内部函数可以引用外部函数的参数和变量以及这些参数和变量不会被垃圾回收机制回收。 ...
- **作用域**:JavaScript有两种主要的作用域规则——函数作用域和块级作用域。理解这些规则对于避免变量污染和提升代码质量至关重要。 - **闭包**:闭包是一种特殊的函数,它可以访问定义在其外部的函数的变量。...
这种情况下,变量的作用域遵循变量作用域的规则。变量必须在函数表达式被定义后才能使用,否则会引发未定义的错误。例如: ```javascript bar(5); // 这会导致未定义错误,因为 bar 在这里还未被定义 var bar = ...
立即执行函数表达式是一种创建私有作用域并立即运行的函数。它通常用括号包裹函数定义,然后紧接着另一个括号传递参数。例如: ```javascript (function fun(a, b, c) { // ... })(1, 2, 3); ``` 这里的第一...