V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
bitinn
V2EX  ›  JavaScript

side-effect 还是 return

  •  
  •   bitinn · 2015-01-24 17:45:02 +08:00 · 2394 次点击
    这是一个创建于 3589 天前的主题,其中的信息可能已经有所发展或是发生改变。

    同样是修改一个属性

    function f1(o) {
      o.a++;
    }
    
    function f2(o) {
      return { a: o.a + 1 };
    }
    
    var obj = { a:0 };
    // f1(obj)
    // obj = f2(obj);
    

    你们一般用哪种?side-effect方便是很方便,但是在复杂的程序里,选择functional会比较容易理解问题出在哪里。当然还有效能的考量,毕竟后者制造了新的object。

    补充:还有几种情况,例如o.prototype.incr,或者干脆传入o.a再return得到结果。想看看各位取舍的时候有没有一定的思维规则。

    第 1 条附言  ·  2015-01-24 18:40:25 +08:00
    还有这种,会导致要写比较多的函数,javascript似乎也鼓励这种行为(不一定都可行,有时你可能期望同时更新多个属性,导致一些其他问题)。

    ```
    function f3(o) {
    return o.a + 1;
    }

    var obj = { a:0 };
    o.a = f3(o);
    ```
    6 条回复    2015-01-25 09:19:32 +08:00
    JamesRuan
        1
    JamesRuan  
       2015-01-24 17:53:59 +08:00 via Android
    自从了解了functional后就没有跨函数使用过副作用,觉得可以显著减少bug。
    abelyao
        2
    abelyao  
       2015-01-24 18:28:09 +08:00 via iPhone
    第二種,因為第一種在外部看起來,並不確定是否影響了傳入的參數,還是只是根據這個參數去做其它事。
    msg7086
        3
    msg7086  
       2015-01-24 18:37:33 +08:00
    只给f1 f2要怎么讨论啊?
    至少给一下实际场景吧。
    不同作用的函数本来就可能会有不同的实现方法。
    bitinn
        4
    bitinn  
    OP
       2015-01-24 18:49:53 +08:00
    @msg7086 我现在的感觉是,想不到有什么场景f1是更好的选择。
    msg7086
        5
    msg7086  
       2015-01-24 19:57:30 +08:00
    @bitinn javascript我不熟不好评论,但是对于大对象,如果你按值返回的话会造成额外拷贝。
    至少像C++之类的环境下,sort之类都是原地处理的,就是避免大数据拷贝降低性能。
    平时的话一般是选返回新值的,毕竟清晰方便很多。
    monkeylyf
        6
    monkeylyf  
       2015-01-25 09:19:32 +08:00
    大部分情况都倾向于return
    一些情况可以side effect 不过一定要有注释
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5344 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 07:54 · PVG 15:54 · LAX 23:54 · JFK 02:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.