Javascript学习笔记3 作用域

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日

相关文章

  • tree shaking对打包体积优化及作用

    什么是Tree Shaking Tree Shaking 是指在打包过程中,检测出未被引用的代码,并在最终打包结果中将这些未引用的代码(也被称为“未引用代码(dead code)”)移除。Tree Shaking 目的是为了精简打包后的代码和减小文件体积,提升网页加载速度。 在理解 Tree Shaking 之前需要了解几个概念:- 模块 (Module):…

    JavaScript 2023年6月11日
    00
  • 使用javascript做在线算法编程

    下面是“使用Javascript做在线算法编程”的完整攻略。 一、概述 在线算法编程指的是通过一个网站或平台提供的在线编程环境,使用一定编程语言完成特定算法题目,将编写的代码提交,经过编译测试后得到结果。Javascript作为一种常用的脚本语言,在线算法编程中也有广泛的应用。 二、步骤 1. 选择合适的在线算法平台 当前,市场上有不少针对在线算法编程的网站…

    JavaScript 2023年5月18日
    00
  • 详解JavaScript中的事件流和事件处理程序

    详解JavaScript中的事件流和事件处理程序 JavaScript中的事件是指用户与网页进行交互时所产生的所有动作,比如鼠标点击、键盘敲击、窗口滚动等等。JavaScript需要对这些事件进行处理,而事件的类型和顺序则由事件流来控制。本篇文章将详细介绍JavaScript中的事件流和事件处理程序,并提供示例说明。 事件流 事件流描述的是从页面中接收事件的…

    JavaScript 2023年5月18日
    00
  • JS触摸事件、手势事件详解

    JS触摸事件、手势事件详解 什么是触摸事件和手势事件 触摸事件是基于触摸输入设备,如手机屏幕,触发的事件。触摸事件包含以下几种: touchstart:手指触摸屏幕时触发; touchmove:手指在屏幕上滑动时连续触发; touchend:手指离开屏幕时触发; touchenter:手指触摸到一个DOM元素时触发; touchleave:手指离开一个DOM…

    JavaScript 2023年6月11日
    00
  • JavaScript工具库MyTools详解

    JavaScript工具库MyTools详解 什么是MyTools MyTools是一个JavaScript工具库,提供了常见的JavaScript操作方法,使得开发者在开发过程中能够快速、便捷地实现一些功能,提高开发效率。 如何使用MyTools 使用MyTools需要在项目中引入MyTools的js文件。 以下是一个使用的例子: <script t…

    JavaScript 2023年6月10日
    00
  • 详解JavaScript实现JS弹窗的三种方式

    详解JavaScript实现JS弹窗的三种方式 前言 在网页开发中,经常会用到弹窗这个功能。弹窗可以用来展示一些重要信息、提醒用户进行操作,甚至用来进行登录等相关操作。本文将详细介绍 JavaScript 实现三种 JS 弹窗的方式。 方式一:原生 JavaScript 实现 原生 JavaScript 实现弹窗的方式主要使用 window.alert()、…

    JavaScript 2023年5月18日
    00
  • [翻译] JW Media Player 中文文档第4/4页

    首先需要说明的是,JW Media Player 是一款广泛使用的媒体播放器。其官方文档提供了详细的中文翻译,这里以第4/4页为例,为大家讲解如何将其翻译出来。 以下是完整的翻译攻略: 1. 下载原始文档 首先需要从官网上下载原始的英文文档,网址为:https://developer.jwplayer.com/jw-player/docs/developer…

    JavaScript 2023年6月11日
    00
  • JavaScript入门教程(5) js Screen屏幕对象

    JavaScript入门教程(5) js Screen屏幕对象 简介 Screen 对象代表了当前浏览器所在电脑的屏幕信息。通过 Screen 对象,我们可以获取到客户端屏幕的宽、高、物理宽、高、可用宽、高等相关信息,可以方便设计响应式页面。 属性 Screen.width 获取当前屏幕的宽度。 Screen.height 获取当前屏幕的高度。 Screen…

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