活动介绍

Scope(作用域).md

preview
需积分: 0 1 下载量 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程序执行逻辑的关键概念之一。掌握不同作用域类型及其特性对于编写高效、安全的代码至关重要。
身份认证 购VIP最低享 7 折!
30元优惠券
真不可思议
  • 粉丝: 7
上传资源 快速赚钱
voice
center-task 前往需求广场,查看用户热搜

最新资源