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 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
# 高阶函数 // js的函数其实都是指向变量,函数的参数能接受变量 // 那么一个函数接受另一个函数作为参数,就称之为高阶函数 function add(x, y, f) { return f(x) + f(y); } add(-5, 6, Math.abs); //11 // map function pow(num) { return num * num; } var arr = [1,2,3,4,5,6,7,8,9]; arr.map(pow); // [1, 4, 9, 16, 25, 36, 49, 64, 81] // map的callback(currentValue, index, array)其实接收3个参数,所以用原生的Math.pow就会有问题 // 结果变成了 1的0次方 2的1次方 3的平方 4的立方 5的四次方... arr.map(Math.pow); //[1, 2, 9, 64, 625, 7776, 117649, 2097152, 43046721] // reduce function sum(num1, num2) { return num1 + num2; } arr.reduce(sum); // 45 // filter arr.filter(function(x){ return x % 2 !== 0; //过滤掉偶数 }); // sort var arr = [10, 20, 1, 2]; arr.sort(); // [1, 10, 2, 20] 默认转成string,再根据ASCII排序 arr.sort(function(x, y){ // [1, 2, 10, 20] 自定义排序 if (x > y) { return 1; }else if (x == y) { return 0; } else { return -1; } }); # 方法与函数(this关键字) // 在一个对象中绑定函数,称为这个对象的方法 // 和普通函数也没啥区别,但是它在内部使用了一个this关键字 function getAge () { var y = new Date().getFullYear(); return y - this.birth; } var xiaoming = { 'name' : '小明', 'birth' : 1990, 'age' : getAge }; alert(xiaoming.age()); // 26(2016-1990=26) 该函数的this指向被调用的对象 xiaoming alert(getAge()); // NaN 该函数的this指向被调用的对象 window,在'use strict';模式下会指向undefined,所以会报错 var fn = xiaoming.age; // 先拿到xiaoming的age函数 alert(getAge()); // NaN 这样也不行,要保证this指向正确,必须用obj.xxx()的形式调用! // 匿名嵌套的情况下,内层匿名如果直接使用this也会执行window或undefined // 可以使用that先捕获this var xiaoming = { name: '小明', birth: 1990, age: function () { var that = this; // 在方法内部一开始就捕获this function getAgeFromBirth() { var y = new Date().getFullYear(); return y - that.birth; // 用that而不是this } return getAgeFromBirth(); } }; alert(xiaoming.age()); // 26 # apply和call绑定this的指向 // 可以使用apply方法控制this的指向 第一个参数:需要绑定this的变量 第二个参数Array,函数本身的参数 alert(getAge.apply(xiaoming, [])); //26 函数指向xiaoming,参数为空 // call和apply类似,但是参数按顺序传入不是打包成Array 类似于php的call_user_func和call_user_func_array // 对于普通函数的调用通常把this绑定为null alert(Math.max.apply(null, [2,3])); alert(Math.max.call(null, 2, 3)); // 装饰器 // JavaScript所有的对象都是动态的,包括内置函数 // 比如我们想统计使用了多少次parseInt() var count = 0; var oldParseInt = parseInt; window.parseInt = function() { count++; return oldParseInt.apply(null, arguments); } parseInt('1'); parseInt('2'); alert(count); |