js中作用域的实例解析

JS中作用域的实例解析

在JavaScript中,作用域(Scope)是指访问变量、函数等标识符的范围。JavaScript的作用域基于函数(Function)而非块级作用域(Block Scope),这意味着变量的作用域在代码块 {} 中没有意义,而是在它们所在的函数中定义的。本篇攻略将通过实例来详细讲解JS中作用域的概念。

一、全局作用域

全局作用域(Global Scope)是最外层的作用域,在任何地方都可以访问其中的变量和函数。如下所示:

var a = 1; // 全局变量

function foo() {
  console.log(a); // 可以访问全局变量a
}

foo(); // 1

上述代码中,变量a是在全局作用域中声明的,因此可以在foo函数中访问到。

二、函数作用域

函数作用域(Function Scope)是函数内声明的变量所在的作用域,只能在函数内部访问。如下所示:

function foo() {
  var a = 1; // 函数内部变量
  console.log(a); // 可以访问函数内部变量a
}

foo(); // 1
console.log(a); // a is not defined

上述代码中,变量a是在函数内部声明的,因此只能在函数内部访问。在函数的外部访问a会出现“a is not defined”的错误。

三、块级作用域

块级作用域(Block Scope)在ES6标准中引入,是指通过let、const声明的变量所在的作用域,可以在块级作用域内部访问。如下所示:

if (true) {
  let a = 1; // 块级作用域变量
  const b = 2; // 块级作用域变量
  console.log(a, b); // 可以访问块级作用域变量a和b
}

console.log(a, b); // a is not defined, b is not defined

上述代码中,变量a和b被放在if语句块中声明,因此只能在if语句块内部访问。在if语句块之外访问a和b会出现“a is not defined, b is not defined”的错误。

四、变量查找

在JavaScript中,如果在当前作用域中找不到指定的变量,它会一层一层地向上查找,直到找到全局作用域。如下所示:

var a = 1; // 全局变量

function foo() {
  console.log(a); // 可以访问全局变量a
}

function bar() {
  var a = 2; // 同名变量,屏蔽了全局变量a
  foo(); // 1
}

bar();

上述代码中,函数bar中定义了与全局变量a同名的变量a,因此在foo函数中访问变量a时会访问到全局变量a。

五、闭包

闭包(Closure)是指函数能够访问并使用函数外部的变量,即使函数已经执行完毕并返回了,外部变量的值也不会消失。如下所示:

function outer() {
  var a = 1; // 外部变量

  function inner() { // 内部函数
    console.log(a); // 可以访问外部变量a
  }

  return inner; // 返回内部函数
}

var foo = outer(); // 赋值函数outer的返回值,即内部函数inner
foo(); // 1

上述代码中,函数inner能够访问并使用函数outer内部的变量a,即使outer函数已经执行完毕并返回了,a的值也不会消失。

六、总结

在JavaScript中,作用域是指访问变量、函数等标识符的范围,可以分为全局作用域、函数作用域和块级作用域。变量在查找时会一层一层地向上查找,直到找到全局作用域。闭包能够访问并使用外部变量,即使外部函数已经执行完毕并返回了。掌握JS的作用域规则,能更好的编写出正确的代码。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js中作用域的实例解析 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • 分享11个常用JavaScript小技巧

    分享11个常用JavaScript小技巧 在这篇文章中,我们将分享11个常用的JavaScript小技巧,这些技巧能够帮助你更好的理解JavaScript的各种特性和功能。下面是这11个小技巧的详细说明: 技巧1: 使用let和const关键字 使用let和const关键字可以声明变量和常量,相比使用var声明的变量,let和const关键字具备了更好的作用…

    JavaScript 2023年5月18日
    00
  • 常用的9个JavaScript图表库详解

    常用的9个JavaScript图表库详解 1. Chart.js Chart.js 是一个使用 HTML5 canvas 元素创建图表的 JavaScript 库。它可以绘制多种类型的图表,例如线性图、柱状图、饼图等等。 Chart.js 具有良好的文档和易于使用的 API。它适合初学者和有经验的开发者。 以下是一个简单的例子: <canvas id=…

    JavaScript 2023年5月27日
    00
  • Javascript array类 数组操作方法

    JavaScript 的 Array 类是经常被使用的一种数据类型,用于存储有序且可变长度的数据。为了更好的操作数组,JavaScript 提供了丰富的数组操作 API,包含创建、增加、删除、遍历和排序等方法。本文将介绍 JavaScript 的 Array 类的常用操作方法及其使用方法,内容如下: 创建数组 语法 new Array(); // 空数组 n…

    JavaScript 2023年6月10日
    00
  • 详解JavaScript的定时器

    下面是详解JavaScript的定时器的完整攻略: 什么是JavaScript定时器 JavaScript定时器是用来控制代码在指定的时间间隔内执行的方法。它们是非常有用的,可以用于制作动画、轮播图、定时更新时间等。JavaScript中有两种类型的定时器:setInterval()和setTimeout()。 setInterval() setInterv…

    JavaScript 2023年5月27日
    00
  • Vue 禁用浏览器的前进后退操作

    要禁用浏览器的前进后退操作,可以使用Vue-Router提供的Navigation Guards对用户的操作进行拦截。 具体实现步骤如下: 1. 在Vue-Router中使用Navigation Guards 在new VueRouter的时候,我们可以添加beforeEach函数,该函数会在每次路由切换之前调用。我们可以在该函数中进行拦截判断。 示例代码如…

    JavaScript 2023年6月11日
    00
  • js数组实现权重概率分配

    下面是我对“js数组实现权重概率分配”的完整攻略: 概述 在编写JS代码时,经常会需要进行权重概率分配,即根据给定的权重,随机分配某个值。例如,我们可能需要根据一组商品的销量,按照销量大小进行分配,让销量高的商品出现的概率更大一些,从而提高展示效果。 JS中的数组提供了一种方便的实现方法。我们可以根据权重创建一个数组,数组的每个元素代表对应权重下的值,然后随…

    JavaScript 2023年5月27日
    00
  • js的touch事件的实际引用

    下面我将为你详细讲解JS的touch事件实际引用的攻略。 一、什么是Touch事件? Touch事件是一种移动端特有的事件,它包括了以下几个事件: touchstart: 手指触摸屏幕时触发的事件 touchmove: 手指在屏幕上滑动时触发的事件 touchend: 手指从屏幕上离开时触发的事件 touchcancel: 触摸被意外取消时触发的事件,如页面…

    JavaScript 2023年6月11日
    00
  • javascript的BOM汇总

    以下是“Javascript的BOM汇总”的完整攻略。 什么是BOM BOM(Browser Object Model)是指浏览器对象模型,是与浏览器窗口有关的对象的集合,它包括了窗口、地址栏、历史记录、用户代理等对象。 窗口对象 窗口对象是BOM的核心对象之一,它代表了浏览器中的一个窗口或一个标签页。我们可以通过window对象来操作当前窗口或其它窗口的属…

    JavaScript 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部