-
Notifications
You must be signed in to change notification settings - Fork 0
/
enhanced-function.html
72 lines (66 loc) · 3.18 KB
/
enhanced-function.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>enhanced function</title>
</head>
<body>
<script>
// 指定了默认值以后,函数的length属性,将返回没有指定默认值的参数个数
// length属性的含义是,该函数预期传入的参数个数
// 某个参数指定默认值以后,预期传入的参数个数就不包括这个参数了
// 同理,rest参数也不会计入length属性
// 如果设置了默认值的参数不是尾参数,那么length属性也不再计入后面的参数了
console.log((function (a,b,c) {}).length);
console.log((function (a=5) {}).length);
console.log((function (a=5, b, c) {}).length);
// 一旦设置了参数的默认值,函数进行声明初始化时,参数会形成一个单独的作用域(context)
// 等到初始化结束,这个作用域就会消失
var x = 1;
function f(x, y = x) {
console.log(y);
}
f(2); // 2
// 函数的name属性,返回该函数的函数名
function foo() {}
console.log(foo.name);
// ES6 对这个属性的行为做出了一些修改
// 如果将一个匿名函数赋值给一个变量,ES5 的name属性,会返回空字符串
// 而 ES6 的name属性会返回实际的函数名
let fun = function () {};
console.log(fun.name);
// 如果将一个具名函数赋值给一个变量,则 ES5 和 ES6 的name属性都返回这个具名函数原本的名字
const bar = function baz() {};
console.log(bar.name);
// Function构造函数返回的函数实例,name属性的值为anonymous
// bind返回的函数,name属性值会加上bound前缀
// 尾调用(Tail Call)就是指某个函数的最后一步是调用另一个函数
function foobar(x){
return g(x);
}
// 尾调用不一定出现在函数尾部,只要是最后一步操作即可
function foobar1(x) {
if (x > 0) {
return m(x)
}
return n(x);
}
// “尾调用优化”(Tail call optimization),即只保留内层函数的调用帧
// 如果所有函数都是尾调用,那么完全可以做到每次执行时,调用帧只有一项,这将大大节省内存
// 只有不再用到外层函数的内部变量,内层函数的调用帧才会取代外层函数的调用帧,否则就无法进行“尾调用优化”
// ES7 函数参数的尾逗号
// 将参数写成多行(即每个参数占据一行)
// 以后修改代码的时候,想为函数添加第三个参数,或者调整参数的次序
// 就势必要在原来最后一个参数后面添加一个逗号
// 这对于版本管理系统来说,就会显示添加逗号的那一行也发生了变动
// 这样的规定也使得,函数参数与数组和对象的尾逗号规则,保持一致了
function test(
a,
b,
) {
console.log(a, b);
}
test(1,2,);
</script>
</body>
</html>