标签:
函数是编程语言非常重要的一部分,javascript得函数从最初到现在并没有太大得改变。遗留下来的问题和有差别得行为使得程序员很容易犯错,这可能需要程序员通过编写更多的代码来实现普通得功能。
ECMAScript6的函数有了很大的改进,考虑到了很多编程人员投诉和询问的问题。这样的结果是改进了很多ECMAScript 5 JavaScript函数功能,使得编写javascript程序更少出错,功能更强大。
javascript中的函数是特殊的,它允许任意多的参数传递给函数而无视函数定义中声明的参数个数。这样你可以定义一个可以操作不同参数个数的函数,通常是为没有传递的参数给定一个默认值。在ECMAScript 5或者之前的版本中,你可能会通过以下的形式来实现此功能:
function makeRequest(url, timeout, callback) { timeout = timeout || 2000; callback = callback || function() {}; // the rest of the function }
在这个例子中,timeout和callback都是可选的参数,如果在调用函数中没有传递参数,就使用默认值。逻辑操作OR(||)当第一个操作数是false时就返回第二个参数。因为函数调用的时候没有提供参数,那么就是隐式的将函数参数设置为undefined,逻辑操作OR经常用来为缺失的参数提供默认值。这种方式有一个缺点,timeout有可能在调用的时候传递参数0,但是由于OR操作符中0等同于false,timeout最终的值会被2000所替代。
另一个方式来定义缺失的参数是通过检查arguments.length来确认传递的参数个数,ranhou再依次检查每个参数的值是否等于undefined。
ECMAScript 6 为定义默认的参数提供了一种更加方便的方法,例如:
function makeRequest(url, timeout = 2000, callback = function() {}) { // the rest of the function }
这里,在调用函数的时候只有第一个参数是必须要传递的。另外两个参数有默认值,因为不用再确认参数是否被传递,这样函数体就更加简练。当makeRequest函数调用时,传递了三个参数,那么默认参数就不起任何作用。例如
// uses default timeout and callback makeRequest("/foo"); // uses default callback makeRequest("/foo", 500); // doesn‘t use defaults makeRequest("/foo", 500, function(body) { doSomething(body); });
任何有默认值的参数都是可选参数,而没有默认值的参数则是必选参数。
可以为任意的参数提供默认值,包括在没有默认值的参数之前声明默认参数,例如
function makeRequest(url, timeout = 2000, callback) { // the rest of the function }
在这个例子中,timeout的默认值只有在没有第二个参数传递或者第二个参数显式的传递为undefined的时候,例如:
/ uses default timeout makeRequest("/foo", undefined, function(body) { doSomething(body); }); // uses default timeout makeRequest("/foo"); // doesn‘t use default timeout makeRequest("/foo", null, function(body) { doSomething(body); });
在上面例子中,null被认为是传递的确认的值,所以默认参数不会被使用。
也许默认参数最有意思的地方在于默认值不一定是原始值。例如,你可以执行一个函数来返回默认参数:
function getCallback() { return function() { // some code }; } function makeRequest(url, timeout = 2000, callback = getCallback()) { // the rest of the function }
这里,如果最后的参数没有提供,函数getCallback将会被调用来返回正确的默认参数。这可能会给函数带来很多有趣的动态信息的注入。
因为javascript函数可以传递任意多的参数,不需要明确的定义每一个参数。最开始,javascript利用arguments对象来检查函数的没有明确声明的参数,在大多数情况下,这个方法很好用,但是稍显笨重。例如:
function sum(first) { let result = first, i = 1, len = arguments.length; while (i < len) { result += arguments[i]; i++; } return result; }
未完待续。。
标签:
原文地址:http://www.cnblogs.com/avivaWang/p/4305226.html