js高级特性

js极其灵活,我们可以用js来构造我们想要的很多东西,包括java中的类,私有变量,共有方法等。请看以下代码

js实现封装私有变量以及函数

1
2
3
4
5
6
7
8
9
10
11
12
13
var myObject = (
function() {
//私有变量
var _name = "私有变量";
return {
//共有方法,暴露的公共接口
getName: function () {
return _name;
}
}
})();
alert(myObject.getName());//输出:“私有变量”
console.log(myObject._name);//输出"undefine"

以上就可以实现共有方法和私有变量。ts中的类底层就是如此。

变量作用域的问题

js中的函数内可以访问到函数外部变量,外部却不能访问到函数内部变量。而且在每次函数调用完毕后。在函数体内定义的变量都会被清空。每当函数体内使用一个变量时,函数会先从本函数体内寻找定义,后延伸到外部直到找到为止。下面这段包含了嵌套函数的代码,也许能帮助我们加深对变量搜索过程的理解:

1
2
3
4
5
6
7
8
9
10
11
12
var a = 1;
var func1 = function(){
var b = 2;
var func2 = function(){
var c = 3;
alert ( b ); // 输出:2
alert ( a ); // 输出:1
}
func2();
alert ( c ); // 输出:Uncaught ReferenceError: c is not defined
};
func1();

异步函数调用

每次我们使用闭包都要谨慎对待闭包中的变量使用。比如:如果在for循环中的函数体是异步操作话,就会存在很多问题。我们看以下代码

i
1
2
3
4
nodes[ i ].onclick = function(){
alert ( i );//输出5
}
};

这里为什么每次都是输出5呢?因为for循环函数体内为异步操作,在异步操作进行时,for早已经循环完毕。i为5.
我们来看下改进后的代码

( var i
1
2
3
4
5
6
 (function( i ){
nodes[ i ].onclick = function(){
console.log(i);
}
})( i )
};

这里,我们使用闭包将每次的i封在内部,保持每次对它的使用。

下面来看看这段跟闭包相关的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
var extent = function(){
var value = 0;
return {
call: function(){
value++;
console.log( value );
}
}
};
var extent = extent();
extent.call(); // 输出:1
extent.call(); // 输出:2
extent.call(); // 输出:3

这里的extent相当于一个对象,有外部接口call方法以及内部私有变量value。闭包很方便的帮助了我们来构建一个对象等等。

More info: Deployment

鲍志强 wechat
欢迎你扫一扫上面的微信公众号,订阅我的博客!
你的点赞是为了你的未来