由于在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");
默认参数的其他用法
函数的默认参数值可以是一个函数的返回值。
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();