javascript 词法作用域和闭包分析说明

Javascript 词法作用域和闭包分析说明

什么是词法作用域

Javascript 的词法作用域是指一个变量的作用范围仅限于它所在的代码块内部。也就是说,一个变量的作用域由它在代码中的位置决定。

举个例子:

var a = 1;

function foo() {
  var b = 2;
  console.log(a, b); // 1, 2
}

foo();
console.log(a, b); // 1, Uncaught ReferenceError: b is not defined

在这个例子中,变量 a 是全局变量,在 foo 函数内部可以访问。b 是在 foo 函数内部定义的局部变量,它的作用域仅限于 foo 函数内部,外部无法访问到它。

什么是闭包

闭包是指一个函数能够访问它所在的词法作用域之外的变量。简单来说,就是一个函数访问了它外部的变量,即使这个函数在外部作用域调用,这些变量依然存在。

举个例子:

function outer() {
  var a = 1;

  function inner() {
    console.log(a); // 1
  }

  return inner;
}

var fn = outer();
fn();

在这个例子中,inner 函数引用了 outer 函数内部的变量 a,即使 outer 函数已经执行完毕返回了 inner 函数,inner 函数依然可以访问到 a 变量。

闭包的应用场景

闭包在 JavaScript 中有很多应用场景,最常见的是用于封装变量。

例如,我们可以通过闭包封装一个计数器:

function counter() {
  var count = 0;

  return function() {
    count++;
    console.log(count);
  };
}

var c1 = counter();
var c2 = counter();

c1(); // 输出:1
c1(); // 输出:2
c2(); // 输出:1

在这个例子中,counter 函数返回一个引用了 count 变量的函数,count 变量的作用域仅限于 counter 函数内部,外部无法访问。通过这种方式,我们可以封装一个计数器对象,防止外部访问或改变 count 变量。

总结

Javascript 的词法作用域和闭包是非常重要的概念,它们让我们可以更好地封装、组织和重用代码。在开发过程中,我们可以灵活运用这两个概念来提高代码的可读性、可维护性和可扩展性。

以上是本人对 Javascript 词法作用域和闭包的分析说明,如有不足之处,还请指正。

示例

补充一个示例,用闭包实现一个私有变量的计算器:

function createCalculator(init) {
  var count = init;

  return {
    add: function(num) {
      count += num;
    },

    subtract: function(num) {
      count -= num;
    },

    getCount: function() {
      return count;
    }
  }
}

var myCalculator = createCalculator(0);
console.log(myCalculator.getCount()); // 输出:0

myCalculator.add(2);
myCalculator.add(5);
console.log(myCalculator.getCount()); // 输出:7

myCalculator.subtract(3);
console.log(myCalculator.getCount()); // 输出:4

在这个示例中,createCalculator 函数返回一个包含 add, subtractgetCount 函数的对象。这些函数共享同一个词法作用域,能够访问到 count 变量,因此它们可以对 count 变量进行操作。由于 count 变量仅在 createCalculator 函数内部定义,因此无法从外部访问它,实现了私有变量的效果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javascript 词法作用域和闭包分析说明 - Python技术站

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

相关文章

  • JS中判断字符串存在和非空的方法

    JS中可以使用多种方法来判断字符串的存在和非空,以下是一些常见的方法和用法: 1. 使用typeof方法判断 可以使用typeof方法来判断字符串是否存在和非空。如果一个字符串存在,那么typeof将返回”string”,否则将返回undefined。可以将这个值与”string”进行比较来确定字符串是否存在。 var str1; if (typeof st…

    JavaScript 2023年5月28日
    00
  • event.srcElement 用法笔记e.target

    event.srcElement 和 e.target 都是指向事件触发的DOM元素的属性。在不同的浏览器中,其名称和行为可能略有不同,但作用是一样的。 在现代浏览器中,我们应该用 e.target 代替 event.srcElement。下面是两个例子,演示了如何使用这两个属性: 使用 event.srcElement document.addEventL…

    JavaScript 2023年6月10日
    00
  • JavaScript两种计时器的实例讲解

    下面是关于“JavaScript两种计时器的实例讲解”的完整攻略。 什么是计时器 计时器是一种常见的Web开发工具,可以在特定的时间间隔内执行某些代码或者动作。JavaScript提供了两种计时器:setInterval()和setTimeout()。 setInterval()和setTimeout()这两个函数都接受两个参数:一个是要执行的函数,另一个是…

    JavaScript 2023年5月27日
    00
  • js function定义函数使用心得

    那么让我们来详细讲解一下“js function定义函数使用心得”的完整攻略。 1. 定义函数 在JavaScript中,定义函数主要有两种方式:函数声明和函数表达式。 1.1 函数声明 函数声明由function关键字后跟函数名和包含在一对圆括号中的参数列表构成,其语法格式如下: function functionName(parameter1, para…

    JavaScript 2023年5月27日
    00
  • 徒手实现关于JavaScript的24+数组方法

    徒手实现关于JavaScript的24+数组方法 在这篇攻略中,我们将徒手实现JavaScript中24个及以上的数组方法。这些方法包括常用的push,pop,shift和unshift等,以及其他数组方法如map,filter,reduce,every,some等。我们将会学到如何使用JavaScript编写这些方法,这将展示数组方法是如何工作的。 方法1…

    JavaScript 2023年5月27日
    00
  • 用javascript实现页面无刷新更新数据

    实现页面无刷新更新数据的常见方法是使用 AJAX 技术,而在 JavaScript 中,可以使用 XMLHttpRequest 对象来实现 AJAX 请求。下面是实现页面无刷新更新数据的详细攻略: 1. 发送 AJAX 请求 使用 JavaScript 发送 AJAX 请求需要执行以下步骤: 创建 XMLHttpRequest 对象 使用 open() 方法…

    JavaScript 2023年6月10日
    00
  • JavaScript 判断判断某个对象是Object还是一个Array

    判断某个对象是Object还是Array,可以通过以下代码实现: if (typeof obj === ‘object’ && obj instanceof Array) { // obj是Array类型 } else { // obj是Object类型 } 关键点解释: typeof obj === ‘object’:使用typeof操作符…

    JavaScript 2023年5月27日
    00
  • 跟我学习javascript创建对象(类)的8种方法

    跟我学习JavaScript创建对象(类)的8种方法 本文将详细讲解JavaScript中创建对象或类的8种方法,包括对象字面量、构造函数、原型链、Object.create()、工厂模式、Class语法、继承与混合等内容。 1. 对象字面量 对象字面量是一种创建对象的简单方法,通过直接在花括号内定义对象的属性和方法,以冒号作为键名和键值的分隔符。例如: l…

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