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日

相关文章

  • JavaScript中5个常用的对象

    当我在学习JavaScript时,我发现其中的Object类型有很多种,有些我根本没有听说过。经过深入研究后,我总结了JavaScript中最常用的5个对象类型,并在下面进行了详细解释和示例说明。 1. Array对象 数组对象是JavaScript中最常用的一个类型。它允许我们将数据存储在一个变量中,并按索引号访问每个数据,它还提供了很多有用的方法和属性,…

    JavaScript 2023年5月27日
    00
  • 一文带你掌握JavaScript中的箭头函数

    一文带你掌握JavaScript中的箭头函数 在JavaScript中,箭头函数是一种较新的语言特性。相较于传统的函数声明,箭头函数具有更简洁的语法和更明确的this指向,因此逐渐被广泛使用。本文将详细介绍箭头函数的定义、使用场景、注意事项和示例。 定义 箭头函数是一种没有自己this值,必须获取父级作用域中this值得特殊函数语法。它的语法结构比传统的函数…

    JavaScript 2023年6月10日
    00
  • JavaScript构造函数举例详解

    JavaScript构造函数举例详解 一、什么是构造函数? 构造函数是一种特殊的函数,用于创建特定类型的对象。构造函数可以被调用以创建新的对象。 二、如何创建构造函数? 使用function关键字以及大驼峰式命名,例如: function Person(name, age) { this.name = name; this.age = age; this.s…

    JavaScript 2023年5月27日
    00
  • 基于vue 动态菜单 刷新空白问题的解决

    那么让我们来详细讲解一下“基于Vue动态菜单刷新空白问题的解决”的完整攻略。 首先,我们需要了解静态菜单和动态菜单的区别。静态菜单是指在网站中写死的菜单,如果需要更改菜单内容或数量,就需要修改网站代码,并重新发布。而动态菜单是指在后台通过接口获取数据来动态生成菜单的方式,可以根据数据的变化而实现菜单的更新。 在Vue中,我们可以通过组件来实现动态菜单。常见的…

    JavaScript 2023年6月11日
    00
  • JavaScript数组Array对象增加和删除元素方法总结

    JavaScript数组Array对象增加和删除元素方法总结 增加元素 push() 方法 可以使用push()方法将元素添加到数组的末尾。 语法: arr.push(item1, item2, …, itemX) 示例: var fruits = ["apple", "banana"]; fruits.push(…

    JavaScript 2023年5月27日
    00
  • JavaScript的Number对象的toString()方法

    当我们使用JavaScript编写程序的时候,难免会涉及到数字类型的数据操作。Number对象是JavaScript的内置对象之一,它表示数字(包括整数和浮点数)。在实际开发中,我们经常需要将数字类型的数据转化为字符串类型的数据,以便在用户界面中展示或者将数据发送给后端服务器,这时候就可以使用Number对象的toString()方法。 语法 num.toS…

    JavaScript 2023年6月10日
    00
  • JS基于FileSystemObject创建一个指定路径的TXT文本文件

    下面给您详细讲解基于FileSystemObject创建指定路径的TXT文本文件的完整攻略。 步骤一:创建FileSystemObject对象 使用JavaScript创建FileSystemObject对象,可以使用以下代码: var fso = new ActiveXObject("Scripting.FileSystemObject&quot…

    JavaScript 2023年5月27日
    00
  • js对字符串进行编码的方法总结(推荐)

    JS对字符串进行编码的方法总结 在Web开发中,我们经常需要对URL、HTML等不同类型的数据进行编码,以防止不必要的转义或注入攻击。JavaScript提供了多种方法对字符串进行编码,本文将对这些方法进行总结。 1. encodeURIComponent()方法 encodeURIComponent() 方法可把字符串作为 URI 组件进行编码。该方法会对…

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