Skip to content

call by value和call by name

LYF edited this page Apr 27, 2017 · 1 revision

call-by-value和call-by-name,与参数传递有关,但是跟我理解的javascript中只有一种参数传递规则:基于值的传递,是变量值的赋值不是同一回事儿。

这两个名词相关的是参数的求值策略,跟参数传递规则没有关系

对于下面一段简单的代码:

var x = 1;

function f(m){
  return m * 2;     
}

f(x + 5)
  1. 如果是call-by-value,则会在进入函数体之前,进行参数求值,即相当于调用f(6)。C/JavaScript采用这种机制。
  2. 如果是call-by-name,则会在进入函数体之后,进行参数求值,即将表达式x + 5传入函数体中,需要的时候才进行求值。Hskell语言采用这种机制。

传值调用和传名调用,是各有优势。传值调用比较简单,好理解,但有时候传入的参数在函数体中根本没用到,则会出现性能损失。传名引用则没有这个性能损失问题,但是它相对传值调用复杂。

详见:http://www.ruanyifeng.com/blog/2015/05/thunk.html

总结:

  1. call-by-value和call-by-name是参数的求值策略
  2. 基于值的传递是参数的传递规则
Clone this wiki locally