函数的高级用法(一)---关于闭包

函数返回一个函数

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 一个实例出来
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值