if (Function.prototype.bind) { Function.prototype.bind = function(o) { // this 和 arguments 保存 var self = this; var boundArgs = arguments;
returnfunction() { // 创建一个实参列表;将bind()的第二个及后续实参都传入这个函数 var args = []; var i; for (i = 0; i < boundArgs.length; i++) { args.push(boundArgs[i]); } for (i = 0; i < arguments.length; i++) { args.push(arguments[i]); } // 将self作为o的方法调用,传入这些实参 return self.apply(o, args); } } }
Function() 构造函数
Function() 构造函数所创建的函数的词法作用域在全局作用域
1 2 3 4 5 6 7 8
var scope = 'global';
functionconstructFunction() { var scope = 'local'; returnnewFunction('return scope'); }
console.log(constructFunction()()); // global
函数式编程
使用函数处理数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
// 计算 平均数 和 标准差
var sum = function(x, y) { // 计算和 return x + y; };
var square = function(x) { // 计算平方 return x * x; };
var data = [1, 2, 3, 4, 5]; var mean = data.reduce(sum) / data.length; // 平均数 var deviations = data.map(function(x) { return x - mean; }); var stddev = Math.sqrt(deviations.map(square).reduce(sum) / (data.length - 1)); console.log(mean); // 3 console.log(deviations); // [ -2, -1, 0, 1, 2 ] console.log(stddev); //1.5811388300841898
var map = Array.prototype.map ? function(arr, fun) { return arr.map(fun); } : function(arr, fun) { var results = []; for (var i = 0; i < arr.length; i++) { if (i in arr) { results[i] = fun.call(null, arr[i], i, arr); } } return results; };
var reduce = Array.prototype.reduce ? function(arr, fun, initial) { return arr.reduce(fun, initial); } : function(arr, fun, initial) { var i = 0, len = arr.length, accumulator;
if (arguments.length > 2) { accumulator = initial; } else { if (len === 0) { throwTypeError(); }
while(i < len) { if (i in arr) { accumulator = a[i++]; break; } else { i++; } }
if (i === len) { throwTypeError(); } }
while (i < len) { if (i in arr) { accumulator = fun.call(undefined, accumulator, arr[i], i, arr); } i++; }
return accumulator; };
高阶函数
定义: 操作函数的函数, 接受一个或多个函数为参数,并返回一个新函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14
// 返回fun 的返回值的逻辑非 functionnot(fun) { returnfunction() { var result = fun.apply(this, arguments); return !result; } }
var square = function(x) { return x * x; }; var sum = function(x, y) { return x + y; }; var squareofsum = compose(square, sum); console.log(squareofsum(2, 3)); // 25