js中作用域的实例解析

yizhihongxing

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基于prototype实现类似OOP继承的方法

    首先,在JavaScript中,没有像其他面向对象编程语言(如Java和C#等)那样的类(class)机制。但是,JavaScript使用了原型(prototype)机制,来模拟面向对象的继承和多态性。 下面是基于原型实现JavaScript中的继承机制的完整攻略: 1.对象与原型 在JavaScript中,每个对象都有一个关联的原型对象,这个关联就是通过该…

    JavaScript 2023年6月11日
    00
  • 使用 JS 复制页面内容的三种方案

    下面是使用 JS 复制页面内容的三种方案的完整攻略: 一、使用 document.execCommand() 方法 1. 步骤 将待复制的内容放到一个元素中,例如一个 div 标签,在这里我们以一个具有 class 为 “copy-content” 的 div 块为例。 html<div class=”copy-content”> <p&g…

    JavaScript 2023年6月11日
    00
  • document.getElementById为空或不是对象的解决方法

    问题背景 在web开发中,常常使用到document.getElementById()方法来获取特定的DOM元素。但有时候会因为各种原因而出现document.getElementById为空或不是对象的错误提示,让开发者很苦恼,并且无法正常运行。 问题原因 造成该错误提示的原因很多,最常见的有以下几种: 当DOM元素尚未加载进页面时尝试获取 DOM元素的I…

    JavaScript 2023年6月10日
    00
  • js检测浏览器夜晚/黑暗(dark)模式方法

    如何检测浏览器的夜晚/黑暗模式 当用户在电脑或手机等浏览器中将主题从白天模式切换到黑夜模式时,浏览器会触发媒体查询 prefers-color-scheme。我们可以利用 JavaScript 检测媒体查询条件,推断出当前是白天还是黑夜模式。 检测浏览器是否支持 prefers-color-scheme 媒体查询 在使用 prefers-color-sche…

    JavaScript 2023年6月10日
    00
  • JS数组中filter方法的使用实例

    下面我将详细讲解JS数组中filter方法的使用实例的完整攻略。 简介 在JavaScript中,数组是非常重要的数据类型之一。在操作数组时,我们常常需要对数组进行筛选。这时,我们可以使用数组的filter()方法来实现。 filter()方法返回一个新数组,其中包含符合指定条件的所有元素。该方法不会改变原始数组。 语法 filter()的语法如下: arr…

    JavaScript 2023年5月27日
    00
  • safari,opera嵌入iframe页面cookie读取问题解决方法

    使用 iframe 嵌入页面时,不同浏览器对 cookie 的处理方式有所不同,其中 Safari 和 Opera 会有 cookie 跨域问题,但这个问题可以通过添加响应的 HTTP 头来解决。 具体的解决方案如下: 方法一:设置相同的域名 将外层页面和嵌入的 iframe 页面设置相同的域名,这样就算是跨域请求,浏览器也会将 cookie 存储到相同的域…

    JavaScript 2023年6月11日
    00
  • ASP.NET搭配Ajax实现搜索提示功能

    ASP.NET是一种用于构建动态网站和Web应用程序的框架。它可以与AJAX(异步JavaScript和XML)结合使用来实现各种功能,其中之一是搜索提示功能。 搜索提示功能允许用户输入关键字时,动态地显示相关联的结果。这种实时反馈可以提高用户的操作效率和用户体验。 以下是使用ASP.NET和AJAX实现搜索提示功能的完整攻略: 创建ASP.NET Web应…

    JavaScript 2023年6月11日
    00
  • Go语言实现简单的一个静态WEB服务器

    一、说明 本文将详细讲解如何使用Go语言实现一个简单的静态WEB服务器。 二、实现步骤 创建HTTP服务器 首先,我们要创建一个HTTP服务器。可以使用内置的net/http包来创建一个HTTP服务器,代码如下: package main import ( "net/http" ) func main() { http.Handle(&q…

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