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日

相关文章

  • JavaScript数据结构之数组的表示方法示例

    JavaScript数据结构之数组的表示方法示例 在JavaScript中,数组是一种基本的数据结构。它可以用来存储一组相关的数据,比如一组数字或者一组字符串。在本文中,我们将介绍数组的表示方法示例,包括声明、访问和修改数组元素等基本操作。 数组的声明和初始化 声明一个数组的语法如下: var myArray = []; 这将创建一个空的数组,可以在后面的代…

    JavaScript 2023年5月27日
    00
  • 利用策略模式与装饰模式扩展JavaScript表单验证功能

    利用策略模式和装饰模式可以很好地扩展JavaScript表单验证功能。下面就详细讲解如何实现这样的扩展: 策略模式 策略模式定义了一系列可以互换的算法,每个算法都独立封装起来,使得它们之间可以互相替换。利用策略模式,我们可以根据不同的策略选择不同的验证算法。 实现步骤 定义验证算法的接口,即策略类接口。 实现不同的验证策略类,每个类都实现策略类接口。 在表单…

    JavaScript 2023年6月10日
    00
  • Javascript前端UI框架Kit使用指南之Kitjs简介

    Javascript前端UI框架Kit使用指南之Kitjs简介 什么是Kitjs Kitjs是一个基于Javascript的前端UI框架,它具有轻便、易用、灵活的特性。 Kitjs基于jquery开发,借鉴了bootstrap、semantic等其他流行UI库的风格和思想,提供了更丰富的组件库,包括表格、表单、弹窗、标签页等常用组件。同时,Kitjs也支持自…

    JavaScript 2023年6月11日
    00
  • 详解Node.js中的事件机制

    详解Node.js中的事件机制 Node.js作为基于事件驱动的后端框架,事件机制非常重要。在Node.js中,事件分为两个主要部分:事件触发器和事件监听器。事件触发器通过emit()函数来触发事件,事件监听器通过on()函数来监听事件。下面将对事件机制进行详细讲解。 事件触发器 事件触发器是指当某个事件发生时,会调用emit()函数来发出一个事件。emit…

    JavaScript 2023年5月28日
    00
  • 在HTML中插入JavaScript代码的示例

    在HTML中插入JavaScript代码有多种方式,包括内部脚本、外部脚本和行内脚本。下面给出三种示例说明。 1. 内部脚本 内部脚本指的是将JavaScript代码直接嵌入HTML中,这种方式在HTML中使用标签来实现。下面是一个示例如何通过内部脚本来实现响应点击事件: <!DOCTYPE html> <html> <head…

    JavaScript 2023年5月18日
    00
  • Javascript Global decodeURI() 函数

    以下是关于JavaScript Global对象中decodeURI()函数的完整攻略,包括两个示例说明。 JavaScript Global对象中的decodeURI()函数 JavaScript Global对象中的decodeURI()函数用于解码一个编码过的URI字符串。URI是Uniform Resource Identifier的缩写,它是一个用…

    JavaScript 2023年5月11日
    00
  • JavaScript实现广告弹窗效果

    JavaScript实现广告弹窗效果的攻略包含以下几个步骤: 1. 创建HTML结构 我们需要为广告弹窗准备一个HTML结构,可以在页面中创建一个div元素,然后在其中嵌套一个img标签和一个关闭按钮元素。其中,img标签的src属性设置为我们需要展示的广告图片地址。例如: <div id="ad"> <img src=…

    JavaScript 2023年6月11日
    00
  • JavaScript严格模式下关于this的几种指向详解

    《JavaScript严格模式下关于this的几种指向详解》是一篇关于JavaScript严格模式下this关键字相关问题的文章,下面将就该篇文章的主要内容进行详细讲解。 一、什么是严格模式 回答这个问题之前需要了解JavaScript严格模式的定义。JavaScript严格模式是当开发者使用更优化的语法、开启更严格的错误提示、禁止使用不安全的语言集合时启用…

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