浅谈JavaScript作用域

yizhihongxing

当我们了解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)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • JavaScript高级教程5.6之基本包装类型(详细)

    JavaScript高级教程5.6之基本包装类型(详细) 基本包装类型介绍 JavaScript中有三种基本类型:Number、String和Boolean。它们是原始值,不是对象。但是,在读取它们的属性时,会创建临时的基本包装类型对象,以便能够访问属性和方法。一旦访问结束,立即销毁这个临时对象。这个临时对象的行为类似于对象类型的实例。 基本包装类型方法 在…

    JavaScript 2023年6月10日
    00
  • Javascript Math max() 方法

    JavaScript中的Math.max()方法是用于返回一组数中的最大值的函数。以下是关于Math.max()方法的完整攻略,包含两个示例。 JavaScript Math对象的max()方法 JavaScript Math中的max()方法用于返回一数中的最大值。下面是max()方法的语法: Math.max([value1[,2[, …]]]) 其…

    JavaScript 2023年5月11日
    00
  • 原生JS实现烟花效果

    原生JS实现烟花效果的完整攻略如下。 准备工作 首先需要在HTML中创建一个画布Canvas元素,并且需要设置Canvas的宽高以及背景颜色。代码如下: <canvas id="fireworks"></canvas> #fireworks { width: 100%; height: 100%; backgrou…

    JavaScript 2023年6月11日
    00
  • Ajax同步与异步传输的示例代码

    下面我将详细讲解一下“Ajax同步与异步传输的示例代码”的完整攻略。 什么是Ajax? Ajax是指异步JavaScript和XML(Asynchronous JavaScript and XML)的缩写,其主要用于在Web应用程序中实现异步数据交换,从而实现与服务器对数据进行交互而无需刷新整个页面的效果。Ajax避免了传统页面刷新方式在交互效率和用户体验方…

    JavaScript 2023年6月11日
    00
  • 在JavaScript中使用对数Math.log()方法的教程

    下面是使用对数 Math.log() 方法的教程及示例说明: 使用对数 Math.log() 方法的教程 1. 什么是对数? 对数是数学中重要的概念之一,指数学中某个数(底数)与另一个数(真数)之间的关系式。换句话说,就是求某个底数下的某个真数的幂的指数是多少。 例如,如果要求以2为底数的8的对数,可以表示为2^x=8,那么对数x就是3,即log2(8)=3…

    JavaScript 2023年6月10日
    00
  • JavaScript ParseFloat()方法

    当需要把字符串转化成 JavaScript 中的数字类型时,可以使用 JavaScript 中的 parseFloat() 方法。这个方法可以把一个字符串中的首个数字或小数点开头的数字转换成浮点型数据(float)。 1. 语法 parseFloat(string) 其中,string 为需要被解析的字符串参数。 2. 示例 2.1. 解析包含整数的字符串 …

    JavaScript 2023年5月28日
    00
  • js判断一个对象是数组(函数)的方法实例

    下面是关于“js判断一个对象是数组(函数)的方法实例”的完整攻略。 判断一个对象是数组的方法 在 JavaScript 中判断一个对象是否为数组的方法有很多种,下面介绍两种比较常用的方法。 方法一:使用 Array.isArray() 使用 Array.isArray() 可以判断一个对象是否为数组,同时可以避免使用 typeof 判断的弊端。 示例代码如下…

    JavaScript 2023年5月27日
    00
  • Javascript Date setMonth() 方法

    以下是关于JavaScript Date对象的setMonth()方法的完整攻略,包括两个示例说明。 JavaScript Date对象的setMonth()方法 JavaScript Date对象的setMonth()方法设置日期对象的月份部分。该方法接受一个整数,表示要设置的月份。月份从0开始,即0表示一月,11表示十二月。如果该参数超出了JavaScr…

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