龙空技术网

关于JavaScript闭包,你必须要了解的知识点

程序猿一个半 163

前言:

如今各位老铁们对“js封装与调用”大约比较关注,看官们都需要了解一些“js封装与调用”的相关文章。那么小编同时在网摘上汇集了一些有关“js封装与调用””的相关资讯,希望姐妹们能喜欢,兄弟们快快来学习一下吧!

#头条创作挑战赛#

在JavaScript中,闭包是一个强大且重要的概念。虽然初学者可能会感到困惑,但深入理解闭包对于成为一名优秀的JavaScript开发人员是至关重要的。在本文中,我们将详细介绍什么是闭包以及它的使用场景,并提供几个例子来帮助您更好地理解。

什么是闭包

闭包是指在一个函数内部创建的另一个函数,并且这个内部函数可以访问和操作其父函数中的变量。简而言之,闭包是由函数及其相关数据(环境)组成的包裹体。

// 一个使用闭包实现的防抖函数function _debounce(func, wait) {	let timeId = null;  return function() {    let ctx = this;    if (timeId) clearTimeout(timeId);    timeId = setTimeout(() => {      func.apply(ctx, arguments);    }, wait);  }}

在JavaScript中,函数每次执行都会创建一个新的执行环境,其中包含了函数的局部变量、参数和内部函数。当内部函数引用了外部函数的变量时,即使外部函数执行完毕,这些变量依然会被保存在内存中,以供内部函数后续的调用和使用。这种将内部函数与其相关数据包裹在一起的机制就是闭包。

闭包的作用

闭包在JavaScript中具有多种作用和用途

1.封装私有变量:闭包可以创建私有变量,即只有通过闭包中的访问函数才能够访问和修改 的变量。这样可以实现数据的安全性和封装性,避免外部直接访问和修改变量,从而提高代码的可靠性和可维护性。

function createCounter() {  var count = 0; // 私有变量    function increment() {  	count++;    console.log(count);  }  function decrement() {  	count --;    console.log(count);  }  return { increment,  decrement }}var counter = createCounter();counter.increment(); // 输出: 1counter.increment(); // 输出: 2counter.decrement(); // 输出: 1

在上面的示例中,我们通过调用createCounter函数创建了一个counter对象,该对象包含了increment和decrement两个方法。通过这两个方法,我们可以操作count变量,但无法直接访问和修改count变量。这样,我们就实现了私有变量的封装。

2.实现模块化的设计模式:通过闭包,我们可以封装一组相关的变量和逻辑,形成一个独立的模块。这样可以避免全局命名空间的污染,提供代码复用性和可维护性。模块化的设计模式在开发大型项目时尤为重要,可以将复杂的代码分解为多个模块,每个模块负责解决特定的问题,使得代码更加可读和可维护。

var MyModule = (function () {  var privateVar = '私有变量'; // 私有变量  function privateMethod() {    // 私有方法    console.log('私有方法被调用');  }  return {    publicMethod: function () {      console.log('公共方法被调用');      privateMethod(); // 在模块内部调用私有方法    },    publicVar: '公共变量'  };})();MyModule.publicMethod(); // 输出: 公共方法被调用 // 输出: 私有方法被调用console.log(MyModule.publicVar); // 输出: 公共变量console.log(MyModule.privateVar); // undefinedMyModule.privateMethod(); // TypeError: MyModule.privateMethod is not a function

在上面的示例中,我们使用立即调用的函数表达式(IIFE)来创建一个匿名函数。这个匿名函数会立即执行,返回一个包含公共方法和属性的对象。私有变量和私有方法则被封装在闭包内部,外部无法直接访问。

3.延迟执行函数:闭包可以将一个函数作为返回值,从而实现函数的延迟执行。这在一些特定的场景中非常有用,例如实现计时器、事件处理函数等。通过将函数作为闭包返回,可以将函数的执行时机推迟到稍后的某个时间点,从而实现更加灵活和精确的控制。

function delayExecution(message, delay) {  return function() {    setTimeout(function() {      console.log(message);    }, delay);  };}var delayedFunction = delayExecution('延迟执行的函数', 2000);delayedFunction(); // 在2秒后输出: 延迟执行的函数

在上面的示例中,delayExecution函数接受两个参数,message表示要输出的消息,delay表示延迟的时间(以毫秒为单位)。该函数返回一个闭包,内部定义了一个匿名函数,该匿名函数通过setTimeout函数来延迟执行输出message。然后,我们通过调用闭包返回的函数来触发延迟执行。

4.缓存数据:在一些需要频繁计算的场景中,闭包可以用于缓存计算结果,以避免重复计算。通过在闭包内部保存计算结果的变量,可以在后续的函数调用中直接使用缓存的结果,提高函数的执行效率。

function createCacheFunc() {  var cache = {}; // 缓存对象  return function(key) {    if (cache[key]) {      console.log('从缓存中获取数据');      return cache[key]; // 返回缓存数据    } else {      console.log('计算并缓存数据');      var result = '计算数据的结果'; // 进行复杂的计算      cache[key] = result; // 将计算结果存入缓存      return result;    }  };}var getData = createCacheFunc();console.log(getData('key1')); // 输出: 计算并缓存数据 // 输出: 计算数据的结果console.log(getData('key1')); // 输出: 从缓存中获取数据 // 输出: 计算数据的结果console.log(getData('key2')); // 输出: 计算并缓存数据 // 输出: 计算数据的结果console.log(getData('key2')); // 输出: 从缓存中获取数据 // 输出: 计算数据的结果

在上面的示例中,我们定义了一个createCacheFunc函数,它返回一个闭包。闭包内部持有一个cache对象,用于缓存数据。闭包接受一个key作为参数,根据key判断缓存中是否已存在数据。如果存在,则直接返回缓存数据;如果不存在,则进行复杂的计算,并将计算结果存入缓存中。

总结

什么是闭包?

一个函数把另一个函数作为返回值 在js中这就创建了一个闭包。

闭包的作用是什么?

1.防止污染全局变量。

2.结果缓存 因为使用闭包函数会引用外部函数的活动对象 把外部函数的结果缓存到内存中。

3.封装 模仿java的面向对象开发。

4.外部可以访问函数内部的值,并且可以实现函数属性和方法的私有化。

标签: #js封装与调用

上一篇谐音!以声诱人的广告语

下一篇没有了