什么是车削功能成JavaScript对象实现?(What is achieved by turnin

2019-10-17 01:18发布

之一的JavaScript的独特特征之一是“函数是对象,并且可以像任何对象被绕过” [1] 。

当艾希先生开始创造的语言,他为什么决定这样做呢? 它是如何有利比起像Java语言中常用的OOP风格? 他有一个先例或这在当时是一个完全独特的想法?

Answer 1:

当然,他并没有发明它, 一流的功能 ,因为上世纪60年代就已经存在。

它给你的权力是写所谓的较高类别的功能 - 即采取其他功能参数的函数。 这是函数式编程的基石。 例如, Array.map是一个函数,它的另一功能的输入,允许有力的结构。

面向对象的编程后来发展,并集中于更耦合/分离数据和行为。 这通常是在容易推理有关代码(无论是在口语和数学感官)为代价的。 许多面向对象语言(Java,C#)现在将在函数式编程的这些元素(即lambda表达式)。

考虑实施的复杂性Array.mapArray.reduceArray.filter像Java语言。 你想用的时候,你必须只用于实现的算法来调用所需的功能的目的创建一个特殊的匿名内部类的一个实例。 在JavaScript函数只是对象和其他事物一样,所以你可以通过一个中,从而导致更简洁,自然的语法。



Answer 2:

@OrangeDog有它的鼻子。 我在写这个答案只是想指出,你可以真正实现所有的“经典”势在必行流程与功能,数组和递归只(假设真== 1和虚假== 0)控制方式:

function ifElse(cond, trueFunc, falseFunc) {
    var paths = [falseFunc, trueFunc]
    return paths[cond()]();
}

function whileTrue(cond, action) {
    return ifElse(cond, whileTrue(cond, action), function() {});
}

function forLoop(initial, cond, increment, action) {
    initial();
    return whileTrue(cond, function() {
        var actionValue = action();
        increment();
        return actionValue;
    }
}

function first(array) { // or ``car``
    return array[0];
}

function rest(array) { // or ``cdr``
    return array.slice(1);
}

function each(array, action) {
    action(first(array));
    each(rest(array), action);
}

等等。 这是JavaScript的Lisp语言/计划根部的结果(它的原型继承模式从自我拍摄,并从C / Java的语法),它可以说是相当强大的,因为你可以很容易地定义新的流量控制机制, 没有任何更改语言本身 ,如:

function categorizer(array, categorizer) {
    var categories = {};
    array.forEach(function(value, index, array) {
        var category = categorizer(value, index, array);
        ifElse(function() {
            return categories[category] instanceof Array ? 1 : 0;
        }, function() {
            categories[category].push(value);
        }, function() {
            categories[category] = [value];
        });
    });
    return categories;
}

categorizer现在可以将定义如何阵列分割成一组中的对象标记的阵列中,可以在其他地方使用,例如的函数:

categorize(['foo', 'bar', 'baz'], function(value) {
    return value.charAt(0);
});

// Produces the following:
{
    f: ['foo'],
    b: ['bar', 'baz']
}


文章来源: What is achieved by turning functions into objects in JavaScript?