函数返回一个函数
function create1(pro) {
console.log("pro : " + pro);
return function(obj1, obj2){
console.log(obj1 + " -- " + obj2);
return obj1 + obj2;
}
}
var c1 = create1("pro"); // 创建函数
c1;
c1(1,2);
这种函数返回另一个函数的,我们第一次调用只是构建了一个外层函数体对象,
只有有后续的调用,才能调用内层函数体,并且重复调用,只会重复内层函数体。
函数表达式—实现类似a()(s)(a) —> ‘jsa’
闭包和toString 用法(参数为类对象的参数。这时会自动调用类对象的转化为字符串的toString方法)
// 声明一个函数表达式
var add = function(x){
var sum = 0;
// 在函数表达式内部有一个求和的内部函数
var tmp = function(x){
sum = sum + x;// 求和
return tmp;
}
// 构建一个函数体的toString()函数
tmp.toString = function(){
return sum;
}
return tmp; // 返回的是一个函数体,如果该函数体有toString()方法,则会调用函数体的toString()方法
}
add(1)(2)(3); //5
add(10)(2)(3); //5
add(100)(2)(8); // 10
add(1)(2)(5);
闭包,保存外部函数的作用域
function makeAdder(addVal){
return function(arg){
return addVal+arg;
}
}
var add2=makeAdder(2);
var a=add2(10)
console.log(a);
// => 12
var b=add2(90)
console.log(b);
// => 92
其实这里运用了闭包的知识,我们都知道闭包会保存外部函数的作用域链,可以捕获外部函数的参数;
当我们返回一个add2()函数的时候,这个函数会一直记住外部函数的addVal的值
[缺点]:过度使用闭包,会造成内存泄漏,就像上面的add2()函数,会一直保存着外部函数的作用域链,直到自己被销毁
函数都有单独的作用域和prototype属性,如果要访问属性和函数里的变量
外部是无法直接访问的,必须先new 一个实例出来