函数

  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

 

posted @ 2017-08-03 09:42  咬尾巴的狐狸  阅读(131)  评论(0编辑  收藏  举报