Javascript学习笔记3 作用域

yizhihongxing

Javascript学习笔记3 作用域

在Javascript中,作用域是指变量能够被访问到的范围。掌握作用域是编写高质量代码的关键。本文将讲解Javascript中的作用域,帮助读者更好地理解Javascript的变量作用范围。

全局作用域

在Javascript中,没有在任何函数内部定义的变量都属于全局作用域,它们可以在代码中的任何地方被访问到。

var myVar = "global";
function myFunction() {
  console.log(myVar);
}
myFunction(); // 输出 "global"

在上面的代码中,变量myVar定义在函数之外,所以它是全局作用域的,可以被函数myFunction内部的代码所访问。

在Javascript代码中,全局作用域是默认存在的,而且无法被删除。全局变量在整个应用程序中都是可访问的,这很容易导致变量名的重复或意外修改,因此应该尽可能避免使用全局变量。

函数作用域

在Javascript中,函数内定义的变量都具有函数作用域,它们只在函数内部可见。

function myFunction() {
  var myVar = "local";
  console.log(myVar);
}
myFunction(); // 输出 "local"
console.log(myVar); // 报错,myVar未定义

在上面的代码中,变量myVar是在函数内部定义的,因此它只在函数内部可见。在函数外部无法访问该变量,会导致未定义的错误。

函数作用域使得变量名可以在不同的函数中被重复使用,同时也可以使代码更加可读。

块级作用域

在ES6以前,Javascript中没有块级作用域。在块内部定义的变量在块外部仍然可见。

if (true) {
  var myVar = "hello";
}
console.log(myVar); // 输出 "hello"

在上面的代码中,变量myVar的定义在if语句块中,但是仍然能在if语句块外部使用。这可能会导致一些意外的行为,因此应该尽可能避免在块内定义函数或变量。

在ES6中,引入了块级作用域的概念,通过使用letconst来声明变量和常量可以创建一个块级作用域。

if (true) {
  let myVar = "hello";
  console.log(myVar); // 输出 "hello"
}
console.log(myVar); // 报错,myVar未定义

在上面的代码中,变量myVar使用let声明,因此只在if语句块内部可见,不会在if语句块外部被访问到。

示例

示例1

var a = 1;
function foo() {
  var b = 2;
  function bar() {
    var c = 3;
    console.log(a, b, c); // 输出1, 2, 3
  }
  bar();
  console.log(a, b); // 输出1, 2
}
foo();
console.log(a); // 输出1

在上面的代码中,变量a是全局变量,在函数内外都可以访问到。变量bfoo函数的局部变量,在foo内部和bar函数都可以访问到。变量cbar函数的局部变量,只能在bar函数内部访问。因此,在输出语句中可以看到每个变量的值。

示例2

for (var i = 1; i <= 5; i++) {
  setTimeout(function() {
    console.log(i);
  }, i * 1000);
}

在上面的代码中,希望每隔1秒输出1到5的数字。但是实际输出的是5个6,而不是1到5。原因是在循环中使用了var定义的计数变量i,它有函数作用域,因此在setTimeout执行时,循环已经结束,变量i的值已经是5。因此每个setTimeout都会输出5。要解决这个问题,需要使用let定义i,它有块级作用域。

for (let i = 1; i <= 5; i++) {
  setTimeout(function() {
    console.log(i);
  }, i * 1000);
}

在上面的代码中,变量i使用let定义,因此每个循环都创建一个新的块级作用域,保证了每个setTimeout访问的是不同的变量。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Javascript学习笔记3 作用域 - Python技术站

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

相关文章

  • JavaScript基础之运算符

    JavaScript基础之运算符 在 JavaScript 中,我们可以使用不同的运算符对各种数据类型进行各种操作。下面介绍几种常用的运算符。 算术运算符 算术运算符用于操作数字类型的数据。 加号(+) 加号用于加法运算。 let a = 1, b = 2; let c = a + b; // c = 3 减号(-) 减号用于减法运算。 let a = 2,…

    JavaScript 2023年5月18日
    00
  • 前端 javascript 实现文件下载的示例

    首先,我们需要了解前端 JavaScript 实现文件下载的方式。一般有两种方式,一种是利用 <a> 标签的 download 属性,另一种是通过 XMLHttpRequest(XHR)对象来实现。 利用标签的download属性下载文件 利用 <a> 标签的 download 属性可以实现前端文件下载。具体实现步骤如下: 在 HTM…

    JavaScript 2023年5月27日
    00
  • PWA介绍及快速上手搭建一个PWA应用的方法

    PWA(Progressive Web App)是一种新型的WEB应用程序模型,它融合了 Web 和 Native 应用的优势。在移动端可更好的解决应用安装、流量消耗、离线访问、消息推送等问题,能够将您的网站变成一个类似于原生移动应用的东西。 本文将介绍PWA的相关知识,并提供快速上手的搭建PWA应用的方法。 PWA介绍 PWA其实是一种思路,而不是某个具体…

    JavaScript 2023年6月10日
    00
  • JavaScript 图片预览效果 推荐

    JavaScript 图片预览效果是一种常见的 Web 前端功能,它可以让用户在网页中浏览图片时更加方便、便捷。本攻略将详细讲解如何使用 JavaScript 实现图片预览效果。下面是详细的步骤。 准备工作 在开始之前,我们需要准备以下内容: 一个 HTML 文件,其中包含需要预览的图片元素。 一个 JavaScript 文件,用于实现图片预览效果。 实现过…

    JavaScript 2023年6月10日
    00
  • HTML5 script元素async、defer异步加载使用介绍

    接下来我将为你详细讲解一下“HTML5 script元素async、defer异步加载使用介绍”的完整攻略。 什么是async、defer异步加载 在HTML5中,script标签有两个属性可以实现异步加载,分别是async和defer。 async属性定义了脚本是否异步加载,异步加载的脚本不会阻塞页面的加载。 defer属性定义了脚本是否延迟执行,延迟执行…

    JavaScript 2023年5月27日
    00
  • javascript中数组的常用算法深入分析

    当我们学习JavaScript编程语言的时候,数组(Array)是一种非常常见和重要的数据结构。数组是一种基本的JavaScript数据类型,它是用来存储一组数据的容器。在日常开发中,我们常常需要对数组进行各种操作。本文将详细介绍JavaScript中数组的常用算法,并分析其实现原理。 数组的常用方法 下面是常用的数组处理方法: 1. 数组去重 functi…

    JavaScript 2023年5月27日
    00
  • Echarts自定义图形的方法参考

    下面是详细讲解Echarts自定义图形的方法参考的完整攻略。 1. 理解自定义图形的概念 在Echarts中,除了常见的图形类型(如折线图、柱状图、散点图等)以外,还支持自定义图形类型。自定义图形指的是使用自定义的图形形状绘制出的图表元素,例如可以用自定义的图形绘制出家具、车辆等实际物品,也可以用自定义的图形实现图表中的特效效果(如动画效果、光影效果等)。 …

    JavaScript 2023年6月11日
    00
  • JavaScript知识点总结(四)之逻辑OR运算符详解

    下面就详细讲解“JavaScript知识点总结(四)之逻辑OR运算符详解”的完整攻略。 1. 什么是逻辑OR运算符? 逻辑OR运算符是JavaScript中的一种运算符,用来判断两个表达式中,只有一个表达式为true时,整个表达式才会返回true,否则返回false。在JavaScript中,逻辑OR运算符使用两个竖线符号||表示。 2. 逻辑OR运算符的语…

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