JavaScript世界当中的 「一等公民」 -> 函数
First-class Function
function test() {}
var test = function() {}
function add(a, b) {
return a + b;
}
function minus(a, b) {
return a - b;
}
function compute(a, b, fn) {
return fn(a, b);
}
console.log(compute(1, 2, add)); // 3
function Compute(a, b) {
this.a = a;
this.b = b;
this.add = function() {
return this.a + this.b;
}
this.minus = function() {
return this.a - this.b;
}
}
var computed = new Compute(1, 3);
console.log(computed.add()); // 4
var test = (function() {
function Compute(a, b) {
this.a = a;
this.b = b;
this.add = function() {
return this.a + this.b;
}
this.minus = function() {
return this.a - this.b;
}
}
return new Compute(10, 1);
})();
console.log(test.add()) // 11
优点:编程灵活、易学
缺点:不可控
输出完全取决于输入
var a = 1;
function test(num) {
console.log(num);
}
test(a); // 纯函数
function add(obj) {
return obj.a + obj.b;
}
function minus(obj) {
return obj.a - obj.b;
}
function compute(num) {
return {
add: add(num),
minus: minus(num)
}
}
var nums = {
a: 1,
b: 2
}
console.log(compute(nums).add);
console.log(compute(nums).minus);
// 请问compute是纯函数吗?
// 他不是,因为compute依赖了外部函数,一旦外部函数发生错误,就影响到了compute
var arr1 = [1, 2, 3, 4, 5],
arr2 = [1, 2, 3, 4, 5];
var spArr = arr1.splice(0, 3),
slArr = arr2.slice(0, 3);
console.log('arr1', arr1);
console.log('arr2', arr2);
console.log('spArr', spArr);
console.log('slArr', slArr)
var obj = {
a: 1,
b: 2,
c: 3
}
// 改变了原对象obj -> 所以他不是纯函数
function test(obj) {
obj.d = 4;
return obj;
}
console.log(test(obj));
// 函数test不可以影响obj
var obj = {
a: 1,
b: 2,
c: 3
}
// 改变了原对象obj -> 所以他不是纯函数
function test(obj) {
// 深拷贝obj
var newObj = deepClone(obj, {});
console.log(newObj);
newObj.d = 4;
function deepClone(obj,cloneObj) {
debugger
var cloneObj = cloneObj || {},
toStr = Object.prototype.toString,
objArr = '[object Array]'
for(var i in obj) {
// console.log(obj[i]);
// 判断i是不是自己的属性
if(!obj.hasOwnProperty[i]) {
// i有可能在自己的原型上面
if(typeof obj[i] === 'object' && obj[i] !== null){
// cloneObj[i] = Array.isArray(obj[i]) ? [] : {};
// cloneObj[i] = obj[i] instanceof Array ? [] : {};
cloneObj[i] = toStr.call(obj[i]) === Object ? [] : {}
deepClone(obj[i], cloneObj[i])
}else {
cloneObj[i] = obj[i]
}
}
}
return cloneObj
}
return newObj;
}
console.log(test(obj));
function compute(a, b, type) {
if(typeof(a) === 'number' && typeof(b) === 'number') {
switch(type) {
case 'add':
return a + b;
break;
case 'minus':
return a - b;
break;
default:
return a + b;
}
}else {
return 'a跟b必须是数字';
}
}
console.log(compute(1, 3, 'add'));
function add(a, b) {
return a + b;
}
// 或者
function add() {
var a = 1,
b =2;
return a + b;
}
function test(fn) {
var cache = {}; // 缓冲池
return function() {
var args = JSON.stringify(arguments);
cache[args] = cache[args]
? cache[args] + '(来自缓冲池)'
// : fn(arguments);
: fn.apply(fn, arguments);
return cache[args];
}
}
// var add = test(function(arguments) {
var add = test(function() {
var argLen = arguments.length,
item,
res = 0;
for(var i = 0; i < argLen; i ++) {
item = arguments[i];
res += item;
}
return res;
});
console.log(add(1, 3)); // 4
console.log(add(1, 3)); // 4(来自缓冲池)
console.log(add(1, 3)); // 4(来自缓冲池)(来自缓冲池)
console.log(add(1, 4)); // 5