详解js的作用域、预解析机制
本文将带您深入了解JavaScript中的作用域和预机制。尽管ES6已经在我们的工作中得到广泛应用,但许多项目仍然使用ES5的写法。今天,让我们再次巩固ES5中的作用域及预机制概念。
一、概念
作用域是指一个变量、函数或表达式的有效范围或可访问范围。在ES5中,主要存在全局作用域和函数级作用域。而预是JavaScript过程中的一个重要环节,包括两个步骤:预和自上而下逐行解读。
预阶段,JavaScript器会将var定义的变量、function以及参数存储到内存中。在这个阶段,所有用var声明的变量都会被初始化为undefined,而函数则会被存储为整个函数块。
二、逐行解读
在逐行解读阶段,表达式如赋值、加减乘除、自增自减、取反、取模等都会被执行。当遇到变量和函数重名时,函数的优先级高于变量,只保留函数。函数调用时,首先会在函数内部寻找参数,如果找不到,则会沿着作用域链向上寻找。
三、实践案例分析
接下来,我们通过几个实例来深入理解上述理论。
例1:
```javascript
alert(a); //error: a is not defined
a = 3;
```
分析:在预阶段,整个作用域没有找到var定义的变量a,所以在执行时程序报错。
例2:
```javascript
alert(a); //undefined
var a = 3;
```
分析:在预阶段,虽然未定义变量a,但在逐行解读时,a被赋值为undefined。第一行alert会弹出undefined。
例3:
```javascript
alert(a); // function a (){ alert(4); }
var a = 1;
alert(a); // 1
function a (){ alert(2); }
alert(a); // 1(弹出函数)
var a = 3;
alert(a); // 3(弹出数字)
function a (){ alert(4); }
alert(a); // 弹出数字3(因为函数的优先级高于变量)
```分析:此例子中涉及到多个变量和函数的同名问题。在预阶段,遇到重名的变量和函数时,函数的优先级高于变量。在执行过程中,会根据的赋值情况弹出不同的结果。需要注意的是,当两个函数重名时,遵循代码从上往下执行的原则。最后弹出的结果是数字3。这是因为当遇到同名函数时,后面的函数会覆盖前面的函数。因此在这个例子中,最后一个声明的函数始终生效。通过这几个实例的分析我们可以更好地理解JavaScript中的作用域和预机制的工作原理。希望本文能帮助大家更深入地理解和掌握这些内容!通过几个简单的例子,我们可以深入理解JavaScript中变量作用域与预的概念。
在第五行的例子中,变量a被赋予了值1。第六行则通过一个表达式对a赋予了新的值3。第七行则弹出一个提示框显示这个新值,也就是数字3。第八行声明了一个函数,这个函数并不会改变全局变量a的值。到了第九行,再次访问全局变量a时,它的值仍然是3。这个例子向我们展示了变量作用域的预过程。
接下来,让我们通过几个关于函数作用域的栗子来进一步理解这个概念。
在例四中,函数fn1试图访问变量a,但在函数内部声明了同名的局部变量a,导致访问的是该局部变量的默认值undefined。而在全局作用域中,变量a的值并未改变。这个例子强调了函数作用域中局部变量与全局变量的区别。
在例五中,函数fn1接受一个参数a,并试图访问它。尽管在函数内部声明了局部变量a,但这个局部变量不会影响函数参数或者全局变量的值。在例六中,虽然函数fn1中的局部变量a被重新赋值为2,但这不会改变传递给函数的参数或者全局变量的值。这是因为函数内部的局部变量是在函数作用域内创建的,它们不会影响外部作用域中的变量。
而在例七中,我们看到函数fn1通过修改全局变量a的值改变了其原有的值。这个例子展示了在函数内部修改全局变量的行为。需要注意的是,尽管可以在函数内部修改全局变量的值,但不建议过度依赖这种行为,因为这可能导致代码难以理解和维护。
这些例子展示了JavaScript中变量作用域和预的复杂性。理解这些概念对于编写清晰、可维护的JavaScript代码至关重要。通过仔细分析和实践这些例子,我们可以更深入地理解JavaScript的作用域规则和行为。希望这些例子能帮助大家更好地掌握JavaScript的变量作用域和预概念。
编程语言
- 详解js的作用域、预解析机制
- asp.net+Ligerui实现grid导出Excel和Word的方法
- js实现仿网易点击弹出提示同时背景变暗效果
- 学习php设计模式 php实现建造者模式
- JQueryEasyUI框架下的combobox的取值和绑定的方法
- vue 使用html2canvas将DOM转化为图片的方法
- 学习php设计模式 php实现抽象工厂模式
- jQuery封装的屏幕居中提示信息代码
- 详解如何在Node.js的httpServer中接收前端发送的ar
- PHP改进计算字符串相似度的函数similar_text()、le
- PHP中模糊查询并关联三个select框
- ASP基础入门第十篇(ASP内建对象Server)
- asp.net core MVC 全局过滤器之ExceptionFilter过滤器(1
- 详解小程序云开发数据库
- 正则表达式提取网址、标题、图片等一例(.Net
- 需灵活掌握的Bootstrap预定义排版类 你精通吗-