call by value和call by name - pod4g/tool GitHub Wiki
call-by-value和call-by-name,与参数传递有关,但是跟我理解的javascript中只有一种参数传递规则:基于值的传递,是变量值的赋值
不是同一回事儿。
这两个名词相关的是参数的求值策略,跟参数传递规则没有关系
对于下面一段简单的代码:
var x = 1;
function f(m){
return m * 2;
}
f(x + 5)
- 如果是call-by-value,则会在进入函数体之前,进行参数求值,即相当于调用
f(6)
。C/JavaScript采用这种机制。 - 如果是call-by-name,则会在进入函数体之后,进行参数求值,即将表达式
x + 5
传入函数体中,需要的时候才进行求值。Hskell语言采用这种机制。
传值调用和传名调用,是各有优势。传值调用比较简单,好理解,但有时候传入的参数在函数体中根本没用到,则会出现性能损失。传名引用则没有这个性能损失问题,但是它相对传值调用复杂。
详见:http://www.ruanyifeng.com/blog/2015/05/thunk.html
总结:
- call-by-value和call-by-name是参数的求值策略
- 基于值的传递是参数的传递规则