Javascript 这是一个有效的模式,它叫什么?
我发现自己越来越多地编写下面的JavaScript,我想知道这是否是一种常见的模式,如果是,它叫什么 代码和模式的一部分:Javascript 这是一个有效的模式,它叫什么?,javascript,design-patterns,Javascript,Design Patterns,我发现自己越来越多地编写下面的JavaScript,我想知道这是否是一种常见的模式,如果是,它叫什么 代码和模式的一部分: var fruits = ["pear", "apple", "banana"]; var getNextFruit = function() { var _index = 0, _numberOfFruits = fruits.length; getNextFruit = function() { render(frui
var fruits = ["pear", "apple", "banana"];
var getNextFruit = function() {
var _index = 0,
_numberOfFruits = fruits.length;
getNextFruit = function() {
render(fruits[_index]);
_index = (_index + 1) % _numberOfFruits;
}
getNextFruit();
};
我有一个不带参数的函数,在函数中我重新定义了函数并立即调用它。在函数式语言中,这可能是一个返回的函数,JavaScript只是让它更简单,因为您可以重用函数名。因此,您可以在不必更改实现的情况下扩展功能
我还可以想象这种模式对于记忆非常有用,因为你的“缓存”是我们环绕的状态
有时,我甚至在函数上使用get
或set
方法来实现这一点,如果状态有意义,我可以从中获取状态。添加的小提琴显示了一个例子
因为这主要是一个面向JavaScript的问题:通过闭包创建函数是JavaScript中非常常见的模式。我个人会采取不同的做法:
var fruits = ["pear", "apple", "banana"];
var getNextFruit = function(fruits) {
var index = 0,
numberOfFruits = fruits.length;
function getNextFruit() {
render(fruits[_index]);
index = (_index + 1) % numberOfFruits;
}
return getNextFruit;
}(fruits);
在我看来,没有什么好的理由把变量名和前导下划线混在一起,因为它们对闭包来说是私有的。上述操作也不会将闭包的工作与外部变量名耦合。我的版本可以成为可重用的服务:
function fruitGetter(fruits) {
var index = 0, numberOfFruits = fruits.length;
function getNextFruit() {
render(fruits[_index]);
index = (_index + 1) % numberOfFruits;
}
return getNextFruit;
}
// ...
var getNextFruit = fruitGetter(someFruits);
var otherFruits = fruitGetter(["kumquat", "lychee", "mango"]);
通过闭包创建函数是JavaScript中非常常见的模式。我个人会采取不同的做法:
var fruits = ["pear", "apple", "banana"];
var getNextFruit = function(fruits) {
var index = 0,
numberOfFruits = fruits.length;
function getNextFruit() {
render(fruits[_index]);
index = (_index + 1) % numberOfFruits;
}
return getNextFruit;
}(fruits);
在我看来,没有什么好的理由把变量名和前导下划线混在一起,因为它们对闭包来说是私有的。上述操作也不会将闭包的工作与外部变量名耦合。我的版本可以成为可重用的服务:
function fruitGetter(fruits) {
var index = 0, numberOfFruits = fruits.length;
function getNextFruit() {
render(fruits[_index]);
index = (_index + 1) % numberOfFruits;
}
return getNextFruit;
}
// ...
var getNextFruit = fruitGetter(someFruits);
var otherFruits = fruitGetter(["kumquat", "lychee", "mango"]);
我有一个不带参数的函数,在函数中我重新定义了函数并立即调用它。
这是一个有效的模式,它叫什么
重新定义自身的函数通常是反模式的,因为它会使内容复杂化很多。是的,有时交换整个函数比在函数中放入if(alreadyinitialized)
条件更有效,但这几乎不值得。当您需要优化性能时,您可以尝试并对这两种方法进行基准测试,但其他方面的建议是尽可能简单
“在第一次调用时初始化自身”模式被称为纯计算模式(在函数式编程中)和对象模式(在OOP中)
然而,大多数情况下,没有理由推迟对象/功能/模块的初始化,直到它首次使用。为它所花费的资源(时间和内存)是微不足道的,特别是当您确信您的程序中至少需要一次它时。为此,请在JavaScript中使用,这在创建对象时也称为
我有一个不带参数的函数,在函数中我重新定义了函数并立即调用它。
这是一个有效的模式,它叫什么
重新定义自身的函数通常是反模式的,因为它会使内容复杂化很多。是的,有时交换整个函数比在函数中放入if(alreadyinitialized)
条件更有效,但这几乎不值得。当您需要优化性能时,您可以尝试并对这两种方法进行基准测试,但其他方面的建议是尽可能简单
“在第一次调用时初始化自身”模式被称为纯计算模式(在函数式编程中)和对象模式(在OOP中)
然而,大多数情况下,没有理由推迟对象/功能/模块的初始化,直到它首次使用。为它所花费的资源(时间和内存)是微不足道的,特别是当您确信您的程序中至少需要一次它时。为此,请在JavaScript中使用,这在创建对象时也称为。下划线的说法完全正确,除了我通常使用的一些奇怪的“编码标准”之外,没有什么好的理由。使重构更容易,并且不会遗漏变量。回到问题上来,闭包是一种模式吗?或者闭包只是一种语言特性?闭包是一种语言特性。这是“对象”的术语,它被创建和维持以保存局部变量,这些局部变量在调用函数返回函数时被“捕获”(如在代码中)。如果你想使用下划线,那么请这样做并感觉良好。他们只是让我恼火:)谢谢,是的,我有一种感觉,我实际上是在以一种奇怪的方式做一些OO,我只是找不到它背后的模式的实际名称。我会喜欢一个IDE,其中闭合变量有不同的颜色,但我想这是其他人的咆哮;)你对下划线的看法完全正确,除了我通常使用的一些奇怪的“编码标准”,没有什么好的理由。使重构更容易,并且不会遗漏变量。回到问题上来,闭包是一种模式吗?或者闭包只是一种语言特性?闭包是一种语言特性。这是“对象”的术语,它被创建和维持以保存局部变量,这些局部变量在调用函数返回函数时被“捕获”(如在代码中)。如果你想使用下划线,那么请这样做并感觉良好。他们只是让我恼火:)谢谢,是的,我有一种感觉,我实际上是在以一种奇怪的方式做一些OO,我只是找不到它背后的模式的实际名称。我会喜欢一个IDE,其中闭合变量有不同的颜色,但我想这是其他人的咆哮;)不确定
render
做什么,但是在不考虑底层数据类型的情况下逐个“生成”集合的元素称为模式。模式称为“自定义函数”,该名称在