JavaScript在处理功能时提供了非凡的灵活性。它们可以传输并用作对象。现在,我们将看到如何在它们之间前进和装饰它们。
假设我们具有CPU重载函数,但其结果稳定。换句话说,对于同一词,它总是返回相同的结果。
如果经常调用此功能,我们可能需要缓存结果(请记住),以避免在重新计算上花费额外的时间。
但是,我们不会将此功能添加到中间,而是要创建一个包装函数,从而添加了缓存功能。当我们要看到的是,这样做有很多好处。
以下是代码和解释:
在上面的代码中,它是一个装饰器:一个特殊功能,可以接受另一个功能并改变其行为。
它的想法是我们可以调用任何功能,它将返回缓存包装。这很棒,因为我们有很多功能可以使用此特征,而我们需要做的就是将它们应用于它们。
通过将缓存与主函数分开,我们还可以使主功能代码更加容易。
结果是一个“包装设备”:在缓存逻辑中的呼叫“包装”
从外部代码中,包装函数仍然与以前相同。它只会将缓存函数添加到其行为中。
总而言之,使用分离有几个好处,而不是更改自己的代码:
上面提到的缓存装饰不适合对象方法。
例如,在以下代码中,在装饰后停止工作:
错误发生在试图访问和失败的旅行中。您可以告诉为什么吗?
原因是包装器将原始函数调用到行中。
如果您尝试运行以下代码,我们将观察到类似的问题:
因此,包装器传递给原始方法,但没有上下文。结果,发生错误。
让我们解决这个问题。
有一个特殊的构建-in函数方法func.call(context,... args),允许调用函数设置。
语法如下:
它运行,提供第一个参数和后续参数。
简而言之,这两个电话几乎是相同的:
他们都调用,参数为,并且唯一的区别是将其设置为。
例如,在以下代码中,我们在不同对象的上下文中调用:运行和提供,然后设置下一行:
在这里,我们使用给定的上下文和短语呼叫:
在我们的示例中,我们可以将上下文使用框中的原始功能:
现在一切正常。
为了使每个人都更清楚地理解,让我们看看它如何传递:
让我们写更多的常见。直到现在,它只能用于单参数函数。
现在如何缓存多参数方法?
以前,对于单个参数,我们只能使用保存结果,并检索和获得结果。但是现在,我们需要记住参数组合的结果。本机仅使用单个值作为键(键))。
这里有许多解决方案可以实施:
对于许多实际应用,第三种方法就足够了,所以让我们使用它。
当然,我们不仅需要传递,而且还需要传递所有引入的参数。LET对此进行思考,在中间,我们可以获得包含所有参数的伪阵列,然后应更换它。
这是一个更强大的功能:
现在,此包装可以处理任意数量的参数(尽管需要调整哈希功能以允许任何数量的参数。下面将提到有趣的处理方法)。
这里有两个更改:
我们可以改用。
构建方法的语法func.apply是:
它运行设置并使用数组对象作为参数列表。
我之间唯一的语法区别是期望参数列表,并期待包含这些参数的类数组对象。
因此,这两个电话几乎是等效的:
他们使用同一呼叫的给定上下文和参数执行。
只有一个微妙的区别:
...为了迭代,它是小组的对象。例如,一个真实的数组,我们可能会使用它,但是它可能更快,因为大多数JavaScript引擎都可以在内部进行优化。
将所有参数传递给另一个函数,称为“呼叫转发”。
这是其最简单的形式:
当外部代码调用此包装时,它不能与原始功能的调用区分开。
现在,让我们对哈希功能进行较小的改进:
截至目前,它仅适用于两个参数。如果可以将其应用于任何数量,则更好。
自然解决方案是使用arr.join方法:
...不幸的是,这不是很好。因为我们正在调用,该对象既是迭代的对象,又是数组对象,但这不是真实的数组。
因此,通话将失败,我们可以在下面看到:
但是,有一个简单的方法可以使用数组加入方法:
该技术称为方法借用。
我们从常规数组中获得(借用)联接方法,并在我们使用的上下文中运行它。
为什么有效?
那是因为本机方法的内部算法非常简单。
几乎是“根据原始”的说明:如下:
因此,从技术上讲,它需要共存,...等待加入在一起。它的写作方法是有意允许允许任何数组的(不是偶然的,许多方法遵循这种方法)。这也是为什么它也可以与。
通常,除了小东西外,功能或方法被替换为装饰功能。如果原始功能具有属性,例如或其他属性,则装饰后的功能将不再提供这些属性。因为这是装饰器。如果有人使用它们,请小心。
例如,在上面的示例中,如果该函数具有任何属性,则它是没有这些属性的包装设备。
一些包装器可能会提供自己的属性。例如,装饰器计算了调用函数的次数以及所花费的时间以及包装器属性的信息(暴露)。
有一种创建装饰设备可以保留功能属性的访问权限的方法,但这需要一个特殊的对象来包装功能。
装饰性是围绕功能更改的包装设备。该功能仍然完成了主要工作。
可以将装饰视为可以添加到功能中的“功能”或“方面”。我们可以添加一个或多个。所有这些都不需要更改其代码!
为了实现,我们研究了以下方法:
通常使用呼叫转发(呼叫转发):
我们还可以看到一个方法借款(方法借用)的示例,也就是说,我们从一个对象中获取一种方法,并在另一个对象的上下文中“调用”它。使用多个数组并将其应用于参数。另一种方法是使用REST参数对象,即真实数组。
JavaScript领域有许多装饰器。以下示例
假设延迟是1秒
在单位时间(> 1)中,事件中触发的间隔小于1秒。
无论该事件在单位时间(> 1)中触发了多少次,它将仅在1秒内执行一次
原始:https://juejin.cn/post/709739937949360159