从一开始接触js就了解到有闭包这么个神奇的东西,可是由于做前端才刚半年多,平时写的js逻辑也不算复杂,所以一直没在工作中用上闭包的特性。想请教下:
1.各位在工作中写代码经常用到闭包吗?都在哪些情况下使用它的(比如代码的规模?业务逻辑的复杂度?写插件?或者某些特殊情况必须使用闭包的特性?…)
2.如果在代码中使用到了闭包,是不是可以一定程度上说明程序猿的编码水平和所涉及的业务逻辑的复杂程度?
望过来人传道解惑,谢谢!
我说点实在的东西,举一个例子,以下代码是描述一个简易的Modal弹出框组件:
function Modal(option){
var modal;
init();
return new _constructor();
function _constructor(){
this.modal = modal;
this.options = options;
this.show = show;
this.hide = hide;
}
function init(){
createDom();
}
function createDom(){
modal = document.createElement('div');
modal.className = 'modal hide';
document.body.appendChild(modal);
}
function show(){
modal.classList.remove('hide');
}
function hide(){
modal.classList.add('hide');
}
}
var modalInst = new Modal();
这里用到了闭包技巧来封装内部变量 modal
作为属性提供给实例对象来使用。show 和 hide 的作用域都在Modal中,但是实例对象 modalInst 是在 Modal外层的作用域中的,它也可以访问 show 和 hide方法 以及 modal属性。 这种在外层作用域来访问内层作用域变量的技巧叫做闭包
。 编码过程中一般用来封装。
1 闭包在 js 中太普遍,以至于想刻意避免都是有困难的。在需要延迟执行的时候就会用到(比如事件处理函数)。
2 刻意的,可控的使用才算 233
闭包这东西,举个不恰当的例子:就像Java里常说的设计模式。
很多人痴迷于各种设计模式,就想方设法硬是用到工作中,然后就觉得高大上了,而不管合适不合适。实际上,那些前人总结出来的设计模式,确实是精华,确实值得学习。但是不管合适不合适、需要不需要地直接拿来用是不对的。我们应该吸收里面的思想而不是形式,等你代码写多了,经验多了,就会不经意地用上,甚至自创出之前没有但是更适合你自己的模式。
闭包也一样,闭包只是个术语而已,我们应该去了解它形成的原理,它的形成背后的知识点,比如作用域链、变量解析、词法环境等等,从而真正理解为什么出现闭包这种现象。而不是觉得它高大就必须把它用到工作中。等你代码写多了,涉猎范围广了,自然会不知不觉用上它。真的,到那时候,很可能你代码里出现了闭包,但是你却没有意识到。