JavaScript !function(){}()的含义以及知识点作用域和闭包

知识点>
js的作用域和闭包

闭包官方文档:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures

JavaScript 变量可以是局部变量或全局变量。
私有变量可以用到闭包。

什么是闭包:
> 就是函数的局部变量集合,只是这些局部变量在函数返回后会继续存在。
> 就是函数的“堆栈”在函数返回后并不释放,我们也可以理解为这些函数堆栈并不在栈上分配而是在堆上分配
> 当在一个函数内定义另外一个函数就会产生闭包
> "注:变量声明时如果不使用 var 关键字,那么它就是一个全局变量,即便它在函数内定义。"

闭包的注意点
1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。
解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),
把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

闭包需要注意的两种情况----函数作为返回值,函数作为参数传递。

例子:函数作为返回值

1. function greeting(name) {
2. 		var text = 'Hello '; // local variable
 		// 每次调用时,产生闭包,并返回内部函数对象给调用者
3. 		return function() {return text += name; }
 	}
 	
4. 	var sayHello=greeting("Closure");
 	
5. 	document.write(sayHello());
6. 	document.write("<br>");
7. 	document.write(sayHello());
8. 	document.write("<br>");
9. 	document.write(sayHello());
10. document.write("<br>");
11. document.write(sayHello());
12. document.write("<br>");
13. document.write(sayHello());// 通过闭包访问到了局部变量text
	
代码解析:
> 执行第4行时第一行的函数运行一次,返回内嵌函数引用作为第4行sayHello变量的值。
> 之后的第5到13行执行的函数操作其实只是执行sayHello指向的函数(即返回的内嵌函数)。
> 解释text为什么能自增,闭包的概念。

例子:函数作为参数传递

1. var num = 10;

2. var fun = function(var num){
3.    console.log(num);
   }
4. !function(f){
5.     var num = 100;
6.     f(num);
7. }(fun)

代码解析:
> 第四行'!'表示高优先级,被'!'标注的先执行。
> 第7行将fun指向的引用2行函数传给参数f在函数中执行f(?)函数,此时log出来的值是10。
> 解释看js作用域

参考:

博客-深入理解javascript原型和闭包

JS关于闭包

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值