2014-11-02 46 views
0

以下是两个工作版本(用于Node.js)的相同递归函数。递归没有显式设置变量javascript

1版

function getDependencies(mod, result) { 
    result = result || [] 
    var dependencies = mod.dependencies || [] 
    Object.keys(dependencies).forEach(function(dep) { 
    var key = dep + '@' + mod.dependencies[dep].version 
    if (result.indexOf(key) === -1) result.push(key) 
    getDependencies(mod.dependencies[dep], result) // COMPARE THIS LINE 
    }) 
    return result.sort() 
} 

2版

function getDependencies(mod, result) { 
    result = result || [] 
    var dependencies = mod.dependencies || [] 
    Object.keys(dependencies).forEach(function(dep) { 
    var key = dep + '@' + mod.dependencies[dep].version 
    if (result.indexOf(key) === -1) result.push(key) 
    result = getDependencies(mod.dependencies[dep], result) // COMPARE THIS LINE 
    }) 
    return result.sort() 
} 

如何函数工作1版本相比,2.0版本,但没有明确设定结果变量?

+0

你的分号钥匙坏了吗? – jfriend00 2014-11-02 06:17:06

+0

这是来自Nodeschool的Node.js解决方案。 – user3477405 2014-11-02 06:17:58

回答

1

result.push(key)result.sort()都修改作为参数传入的result数组。所以不需要在调用者中再次分配它。

+0

那么它是否因参考传递而改变?如果getDepenencies()递归调用多次,我不明白结果如何“加起来”并最终作为一个值返回。 – user3477405 2014-11-02 06:22:47

+0

当您传递或分配对象或数组时,您将获得对同一对象/数组的引用,但它不会创建副本。所以所有的递归调用都在同一个'result'数组上运行。 – Barmar 2014-11-02 06:24:56

+0

@ user3477405 - 只有一个数组。当你将它传递给一个函数时,不会创建副本 - 它是相同的数组。所以,如果一个函数修改它,原始的被修改。无需返回它。它在技术上不是通过引用传递,更像是通过指针传递。 – jfriend00 2014-11-02 06:25:32