浅谈JavaScript作用域

当我们了解JavaScript时,作用域是一个十分重要的概念。它是指 JavaScript 中变量的可访问性。本文将浅谈 JavaScript 的作用域及其相关概念,并通过两个例子来说明作用域的不同。

全局作用域

在 JavaScript 中,最顶层的作用域被称为全局作用域。全局作用域中的变量和函数在代码的任何地方都是可访问的。可以通过以下代码来定义一个全局变量:

var globalVar = 'This is global variable';

全局变量是在最外层声明的变量。由于它对于代码的任何部分都是可访问的,因此要尽量减少全局变量的使用。因为全局变量越多,就越容易发生变量互相覆盖的问题。

函数作用域

在 JavaScript 中,每个函数都有它自己的作用域,被称为函数作用域。这意味着函数作用域中声明的变量和函数只能在函数内部访问。

下面是一个简单的函数作用域的示例:

function myFunction() {
  var localVar = 'This is local variable';
  console.log(localVar);
}

在这个示例中,localVar 是在函数中声明的变量。只有在函数内部才有权访问这个变量。如果在函数外部访问该变量,就会得到一个未定义的错误。这是因为 localVar 只在 myFunction 函数内部存在。

块级作用域

在 ES6(ECMAScript 2015)中,JavaScript 引入了一个新概念 - 块级作用域。块级作用域是指在代码块内定义的变量和函数,在代码块外部是不可访问的。块级作用域可以使用 letconst 声明。

以下示例演示了块级作用域的概念:

if (true) {
  let localVar = 'This is local variable';
  console.log(localVar);
}

console.log(localVar); // 报错,localVar 不是一个定义过的变量

上面的代码中,当 if 语句执行时,它内部的代码块里声明了一个名为 localVar 的变量。但是在该代码块外部,该变量就不存在了,因此最后的 console.log(localVar); 会报错。

闭包

闭包是 JavaScript 中一个重要的概念,也是很多初学者难以理解的概念。在 JavaScript 中,每个函数都会形成自己的作用域。而当函数内部存在另一个函数时,内部函数就会形成一个闭包。每个闭包都可以访问它外部作用域中的变量和函数,在某些情况下,闭包可以用来创建私有变量和私有方法。

以下是一个使用闭包来创建私有变量的示例:

function counter() {
  var count = 0;

  function add() {
    count++;
    console.log('Count: ', count);
  }

  return add;
}

var addFunc = counter();
addFunc(); // 输出 "Count: 1"
addFunc(); // 输出 "Count: 2"

在上面的示例中,counter 函数只在一次调用中执行,但其返回的 add 函数和 count 变量形成了一个闭包。每次调用 addFunc 时,都能访问到该闭包中的 count 变量,并增加它的值。

示例1

以下示例演示了函数嵌套产生的闭包的概念:

function parentFunc() {
  var parentVal = 100;

  function childFunc() {
    var childVal = 50;
    console.log(parentVal + childVal);
  }

  return childFunc;
}

var childFunc = parentFunc();
childFunc(); // 输出 "150"

在上面的示例中,childFunc 函数的内部访问了 parentVal 变量。由于 childFunc 是在 parentFunc函数内部定义的,所以 childFunc 形成了一个闭包,能够访问 parentVal 变量。

示例2

以下示例演示了重复声明变量导致作用域覆盖的概念:

var globalVal = 'This is global variable';

function myFunction() {
  var globalVal = 'This is local variable';
  console.log(globalVal);
}

myFunction(); // 输出 "This is local variable"
console.log(globalVal); // 输出 "This is global variable"

在上面的示例中,globalVal 变量被重复声明两次。函数内部的变量 globalVal 覆盖了全局作用域中的同名变量,因此在函数内部打印 globalVal 时输出了 "This is local variable" 。而在函数外部依然可以访问全局作用域的 globalVal,它的值为 "This is global variable"。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈JavaScript作用域 - Python技术站

(0)
上一篇 3天前
下一篇 3天前

相关文章

  • 如何用JS追踪用户

    下面是关于如何用JS追踪用户的完整攻略: 1. 获取用户信息 我们可以使用JS来获取用户的一些相关信息,如用户的浏览器信息、设备信息、操作系统信息等。例如,我们可以使用以下代码来获取用户的浏览器名称及版本: var browser = navigator.userAgent.toLowerCase(); if (browser.indexOf("m…

    JavaScript 3天前
    00
  • 再谈Javascript中的基本类型和引用类型(推荐)

    再谈JavaScript中的基本类型和引用类型 什么是基本类型和引用类型? JavaScript中的数据类型可以分为基本类型和引用类型。基本类型包括数字、字符串、布尔值、null、undefined和Symbol;而引用类型包括对象、数组、函数等。 基本类型是指简单的数据段,而引用类型是指由多个数据段(属性)组成的对象,每个属性都可以是基本类型或引用类型。 …

    JavaScript 2023年5月18日
    00
  • JS彻底弄懂GMT和UTC时区

    JS彻底弄懂GMT和UTC时区 简介 GMT和UTC是两个不同的概念,但它们之间存在一定的关联。GMT表示格林威治标准时间,它源自于英国伦敦附近的格林威治天文台。而UTC表示世界标准时间,它是目前全球时间协调的基础,包含了许多不同的标准,例如UTC+8表示东八区。 在JavaScript中,Date对象用来处理日期和时间。其中的getTimezoneOffs…

    JavaScript 2天前
    00
  • 老生常谈js中的MVC

    MVC(Model-View-Controller)是一种常用的架构模式,也是前端开发中常用的框架之一,它的目的是将应用程序的输入、处理和输出分离成模块化、清晰的结构,便于维护和开发。下面来详细讲解一下JavaScript中的MVC。 1. 模型层(Model) MVC的模型层(Model)代表一个应用程序中的数据和业务逻辑。任何来自控制器(Controll…

    JavaScript 3天前
    00
  • 前端设计模式——委托模式

    委托模式(Delegation pattern):将一个对象的某个方法委托给另一个对象来执行,它可以帮助我们将对象之间的关系更加灵活地组织起来,从而提高代码的可维护性和复用性。 在委托模式中,一个对象(称为委托对象)将一些特定的任务委托给另一个对象(称为代理对象)来执行。代理对象通常具有和委托对象相同的接口,因此可以完全替代委托对象,而且可以根据需要动态地改…

    JavaScript 2023年4月18日
    00
  • JavaScript实现将UPC转换成ISBN的方法

    要将UPC转换成ISBN,我们需要用到一些JavaScript知识。下面是的完整攻略,包含两条示例: 准备工作 要实现将UPC转换成ISBN,我们需要用到一个叫作EAN-13的标准。这个标准将UPC视为EAN-13的一个子集,因此我们可以通过将UPC的前缀添加到一个特定的EAN-13前缀来得到相应的ISBN。 在开始编写代码之前,我们需要确定一个用于转换UP…

    JavaScript 2023年5月19日
    00
  • js一维数组、多维数组和对象的混合使用方法

    一、一维数组和对象的混合使用方法 可以在对象中嵌套数组,也可以将数组元素赋值为对象。在JS开发过程中,常常会将获取的数据以数组形式存储,或者将指定的某些数据进行组成字典格式,以方便进行读取。 1.在对象中嵌套数组 在对象中嵌套数组,可以将数据更好的组织起来,一次性获取到所有的数据。 示例代码: let student = { name: "Tom&…

    JavaScript 2天前
    00
  • 如何更好的编写js async函数

    当我们在处理异步任务时,使用JavaScript中的Async函数可以极大的简化我们的代码和流程。Async/await函数基于promise对象,使异步代码逻辑更加清晰、易于理解和管理,这同时也使得我们的代码更具可读性和可维护性。以下是如何更好地编写异步函数的完整攻略: 1. Async/await函数的基础 Async/await是ES7中的语言特性,可…

    JavaScript 3天前
    00
  • JavaScript中Function()函数的使用教程

    下面就为大家详细讲解JavaScript中Function()函数的使用教程。 一、什么是Function()函数 Function()函数是JavaScript中的一种内置函数,它用来创建一个函数对象。在JavaScript中,函数也是对象,因此它们可以像其他对象一样传递、存储和处理。 二、Function()函数的基本语法 function functi…

    JavaScript 2天前
    00
  • JavaScript实现的日期控件具体代码

    下面详细讲解一下如何使用JavaScript实现一个日期控件的具体代码。 步骤一:HTML代码编写 首先,在HTML文件中创建一个input元素,用来显示选中的日期,同时给它一个id值。 <input type="text" id="dateInput"> 步骤二:CSS样式设置 接下来,给这个input元…

    JavaScript 2天前
    00