js闭包的9个使用场景

下面是详细讲解“js闭包的9个使用场景”的完整攻略。

什么是JavaScript闭包?

JavaScript闭包是一个函数和定义该函数的环境的组合。闭包让你可以在一个内部函数中访问到其外部函数的作用域。具体来说,就是内部函数能够“记住”并访问外部函数的变量,即使外部函数已经返回了。

9个JavaScript闭包的使用场景

1. 模块化开发

闭包可以帮助我们实现模块化开发,避免变量污染和全局变量的冲突,提高代码的可维护性和复用性。以下是一个示例代码:

var myModule = (function() {
  var myPrivateVar = "I am private";
  return {
    myPublicVar: "I am public",
    myPublicFunction: function() {
      console.log("Public function called");
    },
    myPrivateFunction: function() {
      console.log(myPrivateVar);
    }
  };
})();
myModule.myPublicFunction(); // 输出:Public function called
myModule.myPrivateFunction(); // 输出:I am private
console.log(myModule.myPrivateVar); // 输出:undefined

2. 事件处理程序

闭包可以帮助我们保存事件处理程序中需要用到的上下文信息,避免出现意外的变量污染。以下是一个示例代码:

function addClickHandler() {
  var count = 0;
  var btn = document.getElementById("myBtn");
  btn.onclick = function() {
    count++;
    console.log("Button clicked " + count + " times.");
  };
}
addClickHandler();

3. 私有变量

闭包可以帮助我们实现私有变量。以下是一个示例代码:

function Person(name) {
  var _name = name;
  return {
    getName: function() {
      return _name;
    },
    changeName: function(newName) {
      _name = newName;
    }
  }
}
var person = Person("Tom");
console.log(person.getName()); // 输出:Tom
person.changeName("John");
console.log(person.getName()); // 输出:John
console.log(person._name); // 输出:undefined

4. 防抖和节流

闭包可以帮助我们实现防抖和节流,避免函数被频繁调用。以下是一个防抖的示例代码:

function debounce(fn, delay) {
  var timer = null;
  return function() {
    var context = this;
    var args = arguments;
    clearTimeout(timer);
    timer = setTimeout(function() {
      fn.apply(context, args);
    }, delay);
  }
}
function handleInput() {
  console.log("Input value: " + this.value);
}
document.getElementById("myInput").oninput = debounce(handleInput, 500);

5. 部分应用

闭包可以帮助我们实现函数的部分应用,避免重复书写相同的代码。以下是一个示例代码:

function add(a, b) {
  return a + b;
}
function add5(b) {
  return add(5, b);
}
function add10(b) {
  return add(10, b);
}
console.log(add5(3)); // 输出:8
console.log(add10(3)); // 输出:13

6. 高阶函数

闭包可以帮助我们实现高阶函数,生成函数和处理函数的组合。以下是一个示例代码:

function multiplyBy(n) {
  return function(x) {
    return n * x;
  }
}
var double = multiplyBy(2);
var triple = multiplyBy(3);
console.log(double(4)); // 输出:8
console.log(triple(4)); // 输出:12

7. 缓存

闭包可以帮助我们实现缓存,避免重复计算相同的值。以下是一个示例代码:

function createMultiplyBy2() {
  var cache = {};
  return function(x) {
    if (x in cache) {
      console.log("Cache hit.");
      return cache[x];
    } else {
      console.log("Cache miss.");
      var result = x * 2;
      cache[x] = result;
      return result;
    }
  }
}
var multiplyBy2 = createMultiplyBy2();
console.log(multiplyBy2(2)); // 输出:Cache miss. 4
console.log(multiplyBy2(2)); // 输出:Cache hit. 4

8. 封装

闭包可以帮助我们实现封装,隐藏内部实现细节,提供简单的接口。以下是一个示例代码:

function createPerson(name, age) {
  return {
    getName: function() {
      return name;
    },
    setName: function(newName) {
      name = newName;
    },
    getAge: function() {
      return age;
    },
    setAge: function(newAge) {
      age = newAge;
    }
  };
}
var person = createPerson("Tom", 18);
console.log(person.getName()); // 输出:Tom
person.setName("John");
console.log(person.getName()); // 输出:John

9. 异步

闭包可以帮助我们保存异步函数中需要用到的上下文信息,以便在异步函数回调中使用。以下是一个示例代码:

function fetchData(url, callback) {
  var xhr = new XMLHttpRequest();
  xhr.onreadystatechange = function() {
    if (xhr.readyState === 4 && xhr.status === 200) {
      var data = JSON.parse(xhr.responseText);
      callback(data);
    }
  };
  xhr.open("GET", url, true);
  xhr.send();
}
(function() {
  var username = "Tom";
  fetchData("/api/user?username=" + username, function(data) {
    console.log(data);
  });
})();

以上就是JavaScript闭包的9个使用场景的详细攻略。希望能够对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js闭包的9个使用场景 - Python技术站

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

相关文章

  • js笔试题-接收get请求参数

    要接收URL中的GET请求参数,在JavaScript中,我们可以使用以下几个步骤: 步骤一:解析URL 首先,我们需要解析当前页面上的URL。可以通过window.location.search属性获取查询字符串。查询字符串是指URL中所有从“?”开始的部分,包括问号。例如,对于http://www.example.com/myapp?id=100&amp…

    JavaScript 2023年6月10日
    00
  • JavaScript对象属性设置和屏蔽技巧

    关于JavaScript对象属性设置和屏蔽技巧,我从下面的几个方面详细阐述: 禁止增加属性 我们可以使用 Object.preventExtensions() 方法来禁止对象增加属性。如果我们尝试给一个被禁止增加属性的对象增加属性,就会失败并抛出错误。 const obj = { a: 1, b: 2 }; Object.preventExtensions(…

    JavaScript 2023年5月27日
    00
  • JS中的Replace方法使用经验分享

    下面是关于“JS中的Replace方法使用经验分享”的攻略: 一、Replace方法的基本用法 Replace方法是JavaScript中内置的字符串处理函数,可以在一个字符串中找到一个指定的文本,并将其替换为另一个指定的文本。 以下是Replace方法的基本语法: string.replace(searchvalue, newvalue) 其中,searc…

    JavaScript 2023年6月10日
    00
  • js 格式化时间日期函数小结

    JS 格式化时间日期函数小结 在编写 web 应用程序或者其他应用程序时,日期和时间往往是非常重要的元素。而 JS 提供了许多内置的函数和方法来操作日期和时间,这里提供一些受欢迎的方法,同时会介绍如何使用它们来格式化日期和时间。 定义日期对象 在使用 JS 处理日期和时间时,通常使用内置的 Date 对象。我们可通过以下方式创建一个日期对象: const c…

    JavaScript 2023年5月27日
    00
  • 简单易用的倒计时js代码

    下面是一份简单易用的倒计时js代码的攻略: 1. 先导入jQuery库 <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> 2. 创建一个HTML元素作为计数器容器 可以把它放在合适的地方,如下所示: <div id=&quo…

    JavaScript 2023年5月27日
    00
  • javascript 基础简介 适合新手学习

    JavaScript 基础简介 适合新手学习 JavaScript 是一种广泛应用于编写网页脚本的编程语言。学习 JavaScript 对于新手来说是一项基础工作,本文章为新手介绍 JavaScript 的基础语法、数据类型、流程控制以及实例应用。 JavaScript 基础语法 JavaScript 代码可嵌入 HTML 页面的 \ 标签中。有两种方式,一…

    JavaScript 2023年5月18日
    00
  • JavaScript DOM 学习第三章 内容表格

    JavaScript DOM 学习第三章 内容表格攻略 1. 了解DOM中的Table对象 首先,了解DOM中的Table对象是学习内容表格的关键。Table对象分为三层:table对象本身、行对象tr以及单元格对象td。我们可以通过获取DOM元素的方式获取Table对象: var table = document.getElementsByTagName(…

    JavaScript 2023年6月10日
    00
  • js中document.getElementByid、document.all和document.layers区分介绍

    下面是关于“js中document.getElementByid、document.all和document.layers区分介绍”的完整攻略。 一、介绍 在 JavaScript 中,用于访问和操作 HTML 页面中的元素的常见的方式有三种:document.getElementByid、document.all和document.layers。它们分别代…

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