js闭包简述-不要太去强调闭包,不然你会晕的


title: ‘js闭包简述-不要太去强调闭包,不然你会晕的’
date: 2016-05-27
tags: [js,笔记,闭包]

不要太去强调闭包,不然你会晕的

看了几年的闭包了。但是深挖,就一群呵呵呵了。
不信?先拿别人的试题来考一下,看看这题:https://segmentfault.com/q/1010000002916478
js中的闭包内存会泄露吗?
js中的闭包内存如何释放?
js中的闭包如果不用return,还能取出闭包内的变量吗?
js中的闭包中的变量可以通过外部函数改变吗?
js中的闭包中的变量可以销毁吗?
希望这个讨论能找到答案:https://www.zhihu.com/question/19554716
此文仅作为笔记整理,没什么重要的新的内容。

什么是闭包?

(官方)解释:

一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。

我的解释:

一个函数里定义的局部变量/私有变量,不扔出去,外部就访问不到,这就是个闭包。除非我return,这个闭包才可以被外部访问。

换个思路:

	//我写了几篇博客,我不告诉你,你是看不了。
	var o = (function() {
	  var sherleyBlog = [{
	    "title": "blog1",
	    "content": "blog1-content"
	  }, {
	    "title": "blog2",
	    "content": "blog2-content"
	  }];
	  //只有我告诉你怎么看得到, 你才可能看到,
	  //比如这里我告诉你你可以访问第i篇的标题。
	  //这个闭包才可能被外部访问。
	  return {
	    view: function(i) {
	      return sherleyBlog[i].title;
	    }
	  }
	}());
	//现在你想看?你可以选择看第几篇的标题,因为我只给了你这个接口
	o.view(0); //输出:blog1

这个就是js里闭包的一个写法。
现在看最基础的演示:

	 function a() {
	  var i = 0;
	  function b() {
	    alert(++i);
	  }
	  return b;
	}
	var c = a();
	c(); //输出1

我觉得很好理解。仅限于理解js闭包。
一个例子:

	DOM: 
	<button onclick="newdata()">点我</button>
	
	script:
	 $(document).ready(function() {
	    function newdata() {
	      console.log(999);
	    };
	 });

没用, newdata is not defined。
如能理解闭包,这里就很好理解了,newdata是被闭包在$(document).ready(function() {}) 里的。
外部是访问不到的。
要解决,方案有:

  • 去掉闭包,只写funciton newdata(){}
  • 为按钮绑定事件写在包内,而不是写在DOM上。

上面我问: “js中的闭包如果不用return,还能取出闭包内的变量吗?”
答案是能。 可以定义全局变量,然后在闭包中将需要的值赋给这个全局变量。也可以用参数传递值。


如果再让我答一次“简述js中的闭包”,我应该能拿满分了吧?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值