js极其灵活,我们可以用js来构造我们想要的很多东西,包括java中的类,私有变量,共有方法等。请看以下代码
js实现封装私有变量以及函数
1 | var myObject = ( |
以上就可以实现共有方法和私有变量。ts中的类底层就是如此。
变量作用域的问题
js中的函数内可以访问到函数外部变量,外部却不能访问到函数内部变量。而且在每次函数调用完毕后。在函数体内定义的变量都会被清空。每当函数体内使用一个变量时,函数会先从本函数体内寻找定义,后延伸到外部直到找到为止。下面这段包含了嵌套函数的代码,也许能帮助我们加深对变量搜索过程的理解:
1 | var a = 1; |
异步函数调用
每次我们使用闭包都要谨慎对待闭包中的变量使用。比如:如果在for循环中的函数体是异步操作话,就会存在很多问题。我们看以下代码
1 | nodes[ i ].onclick = function(){ |
这里为什么每次都是输出5呢?因为for循环函数体内为异步操作,在异步操作进行时,for早已经循环完毕。i为5.
我们来看下改进后的代码1
2
3
4
5
6 (function( i ){
nodes[ i ].onclick = function(){
console.log(i);
}
})( i )
};
这里,我们使用闭包将每次的i封在内部,保持每次对它的使用。
下面来看看这段跟闭包相关的代码:
1 | var extent = function(){ |
这里的extent相当于一个对象,有外部接口call方法以及内部私有变量value。闭包很方便的帮助了我们来构建一个对象等等。
More info: Deployment