Scope(作用域).md
需积分: 0 2 浏览量
更新于2021-01-16
收藏 3KB MD 举报
### Scope(作用域)
#### 一、什么是作用域
作用域是编程语言中用来定义变量可见性和可访问性的概念。简单来说,作用域决定了变量在何处可以被引用和使用。在JavaScript中,作用域主要分为两种类型:全局作用域和函数作用域。随着ES6的引入,又增加了一种新的作用域类型——块级作用域。
#### 二、作用域的分类与特性
##### 1. 全局作用域
- **定义**:在任何函数外部声明的变量属于全局作用域。这意味着可以在程序的任何地方访问这些变量。
- **示例**:
```javascript
var globalVar = "I am a global variable!";
function test() {
console.log(globalVar); // 输出 "I am a global variable!"
}
test();
```
在这个例子中,`globalVar` 是一个全局变量,因此可以在 `test` 函数内部被访问。
##### 2. 函数作用域
- **定义**:在函数内部声明的变量仅在该函数内部可见。这意味着这些变量只能在函数内部被访问,不能从外部或者其它函数中访问。
- **示例**:
```javascript
function exampleFunction() {
var x = "declared inside function";
console.log("Inside function");
console.log(x);
}
// 引发 error
console.log(x); // ReferenceError: x is not defined
```
上面的代码中,变量 `x` 只能在 `exampleFunction` 函数内部访问。
##### 3. 块级作用域
- **定义**:ES6 引入了新的关键词 `let` 和 `const`,它们可以创建具有块级作用域的变量。这些变量只在声明它们的代码块内有效。
- **示例**:
```javascript
if (true) {
let blockScopedVar = "I am block scoped!";
}
console.log(blockScopedVar); // ReferenceError: blockScopedVar is not defined
```
在这个例子中,即使 `blockScopedVar` 被声明在一个 `if` 语句中,它也只能在这个 `if` 语句块内部被访问。
##### 4. 作用域链
- **定义**:作用域链是一种机制,用于解决嵌套作用域中的变量查找问题。每当一个函数被调用时,都会创建一个新的作用域链,其中包含当前函数的作用域以及它的外部作用域。这样,函数可以访问其外部作用域中的变量。
- **示例**:
```javascript
var outerVar = "I am an outer variable!";
function outerFunction() {
var innerVar = "I am an inner variable!";
function innerFunction() {
console.log(outerVar); // 输出 "I am an outer variable!"
console.log(innerVar); // 输出 "I am an inner variable!"
}
innerFunction();
}
outerFunction();
```
在这段代码中,`innerFunction` 可以访问其外部作用域(`outerFunction`)中的变量 `outerVar` 和 `innerVar`。
#### 三、提升(Hoisting)
- **定义**:在JavaScript中,变量声明会被提升到作用域的顶部,但初始化不会。对于使用 `let` 和 `const` 声明的变量,则不会有这种提升行为。
- **示例**:
```javascript
console.log(y); // undefined
var y = "I am a hoisted variable!";
console.log(z); // ReferenceError: Cannot access 'z' before initialization
let z = "I am not hoisted!";
```
在这个例子中,`y` 的声明被提升到了作用域的顶部,而 `z` 则不会被提升。
#### 四、闭包(Closures)
- **定义**:闭包是一种特殊的函数,它可以访问其自身作用域、外部作用域以及全局作用域中的变量。
- **示例**:
```javascript
function foo() {
const str = "bar in foo";
return function bar() {
return str;
};
}
var fun = foo();
console.log(fun()); // 输出 "bar in foo"
```
在这段代码中,`bar` 函数是一个闭包,它保存了 `foo` 函数的作用域引用,并且可以访问 `foo` 内部的变量 `str`。
#### 五、严格模式(Strict Mode)
- **定义**:严格模式是JavaScript的一个特性,它可以增强代码的安全性和健壮性。启用严格模式后,代码将在更严格的条件下运行,包括不允许隐式创建全局变量等。
- **启用方式**:
```javascript
"use strict";
```
将此指令放在脚本或函数的开头即可启用严格模式。
- **支持情况**:
- IE 10 及以上版本
- Firefox 4 及以上版本
- Chrome 13 及以上版本
- Safari 5.1 及以上版本
- Opera 12 及以上版本
作用域是理解JavaScript程序执行逻辑的关键概念之一。掌握不同作用域类型及其特性对于编写高效、安全的代码至关重要。

真不可思议
- 粉丝: 7
最新资源
- COMSOL 6.2中1-3压电复合材料厚度共振模态及阻抗相位曲线的有限元仿真建模与优化
- LabVIEW面向对象架构实现模拟树莓派可视化编程:大型项目开发与模块化设计 模块化设计 v2.1
- 材料科学中MD和MC模拟联合应用探索材料微观结构与性能
- 纯电动汽车两档AMT变速箱Simulink模型构建及仿真分析:换挡策略与过程详解
- 深度学习用于雷达和PPG数据的生命体征信号提取及四种神经网络模型的应用 · CNN
- 变频与移相仿真技术在LLC谐振变换器中的应用及优化策略
- 基于脉振高频电压注入法的PMSM矢量控制模型及无位置传感器运行研究
- 永磁同步电机无位置传感器控制:基于IF与龙贝格观测器的Matlab仿真及STM32代码生成 · MatlabSimulink 最新版
- 三相VIENNA整流器的高效仿真研究:基于220V输入、输出电压稳定在800V以内、纹波仅占1%的精细调节与性能优化,以实现0.95以上功率因数及低THD<5%的开关频率控制在20kHz下的Simul
- 航天器姿态滑膜容错控制与飞轮安装偏差及故障研究:MATLAB仿真与文献综述 滑模控制
- 晶体塑性ABAQUS脚本:基于细观力学提取二维三维应力及代表体积单元模型单元体积平均应力和应变的脚本
- 基于改进多目标灰狼算法的微电网调度优化研究与应用
- 基于Matlab的雷达数字信号处理关键技术实现与应用 Pulse Compression
- 基于QRCNN-BiLSTM-MultiAttention的区间预测模型及其Matlab实现与应用
- 智能驾驶AEB系统的联合仿真改进算法:安全距离与TTC切换优化
- 基于Maxwell与Simplorer的电机控制系统联合仿真技术及应用实例