Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 这是一个有效的模式,它叫什么?_Javascript_Design Patterns - Fatal编程技术网

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

我发现自己越来越多地编写下面的JavaScript,我想知道这是否是一种常见的模式,如果是,它叫什么

代码和模式的一部分:

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
做什么,但是在不考虑底层数据类型的情况下逐个“生成”集合的元素称为模式。模式称为“自定义函数”,该名称在