## 1 定义函数 ### 函数 ```JavaScript function abs(x) { if (x >= 0) { return x; } else { return -x; } } var abs = function (x) { if (x >= 0) { return x; } else { return -x; } }; abs(10); ``` JavaScript的函数允许传入过多的参数或者过少的参数,也不会影响函数的执行。 ### 函数的属性arguments > 因为javascript中,函数也被看做对象,所以能给变量赋值。也能有函数的属性。 只在函数内部起作用,并且永远指向当前函数的调用者传入的所有参数 ``` function foo(x) { console.log('x = ' + x); // 10 for (var i=0; i x*x (x, y) => x * x + y * y // 无参数: () => 3.14 // 可变参数: (x, y, ...rest) => { var i, sum = x + y; for (i=0; i new Date().getFullYear() - this.birth; // this指向obj对象 return fn(); } }; obj.getAge();//25 ``` ## 6 generator函数 ### generator函数定义 ``` function* foo(x) { yield x + 1; yield x + 2; return x + 3; } ``` ### generator函数调用 ``` function* fib(max) { var t, a = 0, b = 1, n = 0; while (n < max) { yield a; [a, b] = [b, a + b]; n ++; } return; } ``` 直接调用调用,仅仅创建了一个generator对象,没有执行函数。不断调用next()方法,可以执行generator函数执行。每次遇到yield返回一次。 ``` var f = fib(5);//一个generator对象 f.next(); // {value: 0, done: false} f.next(); // {value: 1, done: false} f.next(); // {value: 1, done: false} f.next(); // {value: 2, done: false} f.next(); // {value: 3, done: false} f.next(); // {value: undefined, done: true} ``` 利用for of方法访问generator对象。 ``` for (var x of fib(10)) { console.log(x); // 依次输出0, 1, 1, 2, 3, ... } ``` ### 特点 因为generator可以在执行过程中多次返回,所以它看上去就像一个可以记住执行状态的函数,利用这一点,写一个generator就可以实现需要用面向对象才能实现的功能。 generator还有另一个巨大的好处,就是把异步回调代码变成“同步”代码。 简单来说,就是一个局部状态变量。 ## 7 装饰器 > (java中称为注解,Python也称为装饰器) 因为JavaScript是脚本语言所有的对象、变量都是动态的。可以随时解绑。可以利用重新绑定的方法,修改原来的函数,为原来的函数添加装饰器。 ``` //统计函数的执行次数 var count = 0; var oldParseInt = parseInt; // 保存原函数 window.parseInt = function () { count += 1; return oldParseInt.apply(null, arguments); // 调用原函数 }; ```