1 /*
2 函数
3
4 function name () {}
5 var name = function () {} 匿名函数
6 关键字arguments,它只在函数内部起作用,并且永远指向当前函数的调用者传入的所有参数。arguments类似Array但它不是一个Array
7 arguments最常用于判断传入参数的个数
8 */
9 function foo(x) {
10 console.log(arguments)
11 for (var i = 0; i < arguments.length; i++) {
12 console.log(arguments[i])
13 }
14 }
15 foo(10, 20, 30)
16
17 function ags () {
18 if (arguments.length == 0) {
19 return 0
20 }
21 var x = arguments[0]
22 return x >= 0 ? console.log(x) : -x
23 //三目运算符,相当于:
24 // if (x>=0) {
25 // return x
26 // }else{
27 // return -x
28 // }
29 }
30 ags(10)
31
32 function foo2(a, b, c) {
33 if (arguments.length === 2) {
34 // 实际拿到的参数是a和b,c为undefined
35 c = b; // 把b赋给c
36 b = null; // b变为默认值
37 }
38 // ...
39 }
40
41 /*
42 rest参数
43 rest参数只能写在最后,前面用...标识,从运行结果可知,传入的参数先绑定a、b,多余的参数以数组形式交给变量rest,所以,不再需要arguments我们就获取了全部参数。
44
45 如果传入的参数连正常定义的参数都没填满,也不要紧,rest参数会接收一个空数组(注意不是undefined)。
46 */
47 function res (a, b, ...rest) {
48 console.log(a)
49 console.log(b)
50 console.log(rest)
51 }
52
53 /*
54 变量作用域
55 全局作用域
56 不在任何函数内定义的变量就具有全局作用域。
57 JavaScript默认有一个全局对象window,全局作用域的变量实际上被绑定到window的一个属性
58
59 全局变量会绑定到window上,不同的JavaScript文件如果使用了相同的全局变量,或者定义了相同名字的顶层函数,都会造成命名冲突,并且很难被发现。
60
61 减少冲突的一个方法是把自己的所有变量和函数全部绑定到一个全局变量中
62
63 局部作用域
64 为了解决块级作用域,ES6引入了新的关键字let,用let替代var可以申明一个块级作用域的变量
65
66 常量
67 由于var和let申明的是变量,如果要申明一个常量,在ES6之前是不行的,我们通常用全部大写的变量来表示“这是一个常量,不要修改它的值”
68 ES6标准引入了新的关键字const来定义常量,const与let都具有块级作用域
69 */
70
71
72 /*
73 方法
74 在一个对象中绑定函数,称为这个对象的方法。
75 */
76 var xiaoming = {
77 name : '小明',
78 birth : 1997,
79 age : function () {
80 var y = new Date().getFullYear()
81 //在一个方法内部,this是一个特殊变量,它始终指向当前对象
82 return y-this.birth
83 }
84 }
85 console.log(xiaoming.age)
86 console.log(xiaoming.age())
87
88 /*
89 apply
90 指定函数的this指向哪个对象,可以用函数本身的apply方法
91 接收两个参数,第一个参数就是需要绑定的this变量,第二个参数是Array,表示函数本身的参数
92 */
93
94 function getAge() {
95 var y = new Date().getFullYear();
96 return y - this.birth;
97 }
98
99 var xiaoming2 = {
100 name: '小明',
101 birth: 1990,
102 age: getAge
103 };
104
105 xiaoming2.age(); // 25
106 getAge.apply(xiaoming2, []); // 25, this指向xiaoming, 参数为空
107
108 /*
109 另一个与apply()类似的方法是call(),唯一区别是:
110
111 apply()把参数打包成Array再传入;
112
113 call()把参数按顺序传入。
114 */
115 Math.max.apply(null, [3, 5, 4]); // 5
116 Math.max.call(null, 3, 5, 4); // 5