详解ES6(四)-函数名与参数

获取函数名

由于在JavaScript中有多种定义函数的方式,因而辨别函数就是一项具有挑战性的任务。此外,匿名函数表达式的广泛使用更是加大了调试的难度,开发者们经常要追踪难以解读的栈记录。为了解决这些问题,ES6中为所有函数增加了name属性,用以标识函数名。

下面是使用示例。

function doSomething(){}
var doAnotherThing = function(){};
var doSomething2 = function doSomethingElse(){}
var person = {
    sayName:function(){}
}
console.log(doSomething.name);
console.log(doAnotherThing.name);
console.log(doSomething2.name);
console.log(person.sayName.name);
默认参数值

ES6为函数增加了默认参数的写法,在ES5中,虽然可以添加任意多的参数,并且可以通过argument数组获取所有的参数,但是如果要设置参数的默认值则相对比较麻烦,一般的写法是这样的:

function makeRequest(url,timeout,callbacke){
	timeout = (typeof timeout != "undefined")?timeout:2000;
	callback = (typeof callback != "undefined")?callback:function(){};
	//函数的其余部分
	
}

在ES6中实现方法就十分简便了,只需要这样写:

function makeResquest(url, timeout = 2000, callback = function () {
    return "default function.";
}) {
    console.log(url + "; " + timeout + "; " + callback());
}
makeResquest();
makeResquest("/foo");
makeResquest("/foo", 500);
makeResquest("/foo", 600, function () {
    return "test funtion."
});
argument与默认参数值

需要注意的是,argument数组元素是所有输入函数的参数,因此函数参数的默认值不会出现在argument中。看一个例子:

function mixArgs(first, second = "b") {
    console.log(arguments.length);
    console.log(first === arguments[0]);
    console.log(second === arguments[1]);
    first = "c";
    first = "d";
    console.log(first === arguments[0]);
    console.log(second === arguments[1]);
}
mixArgs("a");
console.log("---------");
mixArgs("a", "b");

详解ES6(四)-函数名与参数

默认参数的其他用法

函数的默认参数值可以是一个函数的返回值。

function getValue() {
    return 5;
}
function add(first, second = getValue()) {
    return first + second;
}
console.log(add(1, 2));
console.log(add(1));

函数的默认参数值可以是前面的参数

function add(first, second = first) {
    return first + second;
}
console.log(add(1, 2));
console.log(add(1));

可以将前面的参数传递给后面用函数作为参数默认值的函数参数。

function getValue2(val) {
    return val + 5;
}
function add(first, second = getValue2(first)) {
    return first + second;
}
console.log(add(1, 2));
console.log(add(1));
块级函数

在严格模式,块级函数作用域为块级作用域,切会被提升到块级顶端。(使用let定义的函数不会被提升到块级顶端)

"use strict";
if (true) {
    console.log(typeof doSomething); //"function"
    function doSomething() {}
    doSomething();
}
console.log(typeof doSomething); //"undefine"
doSomething(); //报错

如果不是严格模式,则块级函数作用域被提升至全局作用域

if (true) {
    console.log(typeof doSomething); //"function"
    function doSomething() {}
    doSomething();
}
console.log(typeof doSomething); //"function"
doSomething();


· 关注微信公众号【技术斋】,发现更多精彩!

· 公众号《投稿及转载说明》
上一篇:设计模式-模板模式


下一篇:JavaScript-闭包