转载自:http://www.web-tinker.com/article/20153.html
不知从什么时候开始,“链式调用”这个词汇会在中文IT界中蔓延开来。我没有找到相应的英文词汇,就是有“chained calls”这个词组也只是偶然存在与某些句子中罢了。然而,很多人对这个“链式调用”开始望文生义了,于是出现了一堆所谓的“链式调用”。
首先要指出的是,“链式调用”这个词本身就有问题。当我看到“chained calls”这个词组的时候,我的脑子里浮现出的是一堆美国大兵在报数的场景。
首先要指出的是,“链式调用”这个词本身就有问题。当我看到“chained calls”这个词组的时候,我的脑子里浮现出的是一堆美国大兵在报数的场景。
当然,这是狭义的理解。“链式调用”是一个泛概念,到底是什么东西的链式调用不明确。函数的返回值是一个函数时,函数也能链式调用;函数的返回值是一个对象时,直接调用返回值中对象的方法也是链式调用。但是前者显然是没有意义的。这个概念的提出显然不是用来说明函数的返回值可以直接调用这么个脑残事情。真正有意义的链式调用是后者,也就是方法链(
method chaining)。方法链这个词是有的,而且使用的很广泛。其实很多人口中的“链式调用”实际上就是指方法链。但是“链式调用”这个词语还可以描述函数调用链,所以让它自身的存在价值变得难以理解。
我总结的方法链的价值有这么几个:
1. 让调用过程更接近自然语言。
2. 把原本参数列表复杂的方法化作多个参数列表简单的方法来使用。
3. 减少不必要的代码量。
这个三点都是有益于开发的,所以方法链的存在很有意义。jQuery的很多东西就是使用了方法链的概念。下面是一个jQuery的例子。
总之,如果“链式调用”这个词还是尽量别用,因为无法从字面判断含义。除非你想说明的是上面这个脑残东西,你可以用“链式调用”去说,如果只是想描述方法链的概念,就直接说方法链就行了。
我总结的方法链的价值有这么几个:
1. 让调用过程更接近自然语言。
2. 把原本参数列表复杂的方法化作多个参数列表简单的方法来使用。
3. 减少不必要的代码量。
这个三点都是有益于开发的,所以方法链的存在很有意义。jQuery的很多东西就是使用了方法链的概念。下面是一个jQuery的例子。
//发送一个post请求,成功执行done内的回调,这样写更接近自然语言
//把参数列表相对复杂post方法化作只有一个参数的post和done方法来使用
$.post("test.php").done(function(){
//成功时的操作
});
//减少不必要的代码量,避免每次从$("#btn")开始执行方法
$("#btn").css("color","red").attr("href","#");
jQuery是一个很优秀的库,这些写法都是非常实用的。现在我们看看所谓“链式调用”的另一个狭义概念,函数调用链那获取到底是有多脑残。
function f(i){
return function(e){
i+=e;
return function(e){
i+=e;
return function(e){
alert(i+e);
};
};
};
};
f(1)(2)(3)(4); //10
谁要是敢这样写代码马上抓出去揍一顿!这样的写法简直毫无优点,使用者需要记住每个括号调用的含义,还需要记住调用的层数。而且每次调用都需要创建很深的调用堆栈,效率上实在不如普通函数的写法。(后面省略1000句骂它的)
总之,如果“链式调用”这个词还是尽量别用,因为无法从字面判断含义。除非你想说明的是上面这个脑残东西,你可以用“链式调用”去说,如果只是想描述方法链的概念,就直接说方法链就行了。