网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
成为超级会员,使用一键签到
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
07月15日
漏签
0
天
javascript吧
关注:
269,155
贴子:
906,412
看贴
图片
吧主推荐
游戏
6
回复贴,共
1
页
<<返回javascript吧
>0< 加载中...
闲来无事,聊聊Javascript减少全局变量对效率的提升
取消只看楼主
收藏
回复
1950195
trycatch
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
年底,终于看似闲下来了,整理下初学js的心得,和大家分享一下。度娘威武!
1950195
trycatch
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
判断效率的依据还是用普遍的方法——运行时间比较。
这里先定义一个function,return 一个时间毫秒整数:
function now() {
return new Date().getTime();
}
执行 now()得到当前毫秒数;
在代码块前后分别调用,相减所得的值即代码块执行消耗的时间。
2026-07-15 10:50:23
广告
不感兴趣
开通SVIP免广告
1950195
trycatch
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
下面来第一个例子,(我不善理论,嘿嘿...)
var start = now();
//block start:
var i = 0;
for (; i < 1000000; i++) {
}
//block end.
console.log(now() - start);
上面的这个代码块是全局声明的变量,下面的是在匿名函数作用域的局部变量,大家自己对比差异:
var start1 = now();
//block start:
(function() {
var i = 0;
for (; i < 1000000; i++) {
}
})();
//block end.
console.log(now() - start1);
数据证明:全局变量的运算效率要比局部变量的效率低上数百倍。
备注:上面的例子里,i运算的次数是 2000003次;
1950195
trycatch
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
当然,有更直观的方式去看,究竟一个变量定义在全局和定义在局部,效率能差多少?
var start = now();
//block start:
var j = 0;
(function() {
var i = 0;
for (; i < 1000000; i++) {
j = i;
}
})();
//block end.
console.log(now() - start);
var start1 = now();
//block start:
(function() {
var i = 0, j = 0;
for (; i < 1000000; i++) {
j = i;
}
})();
//block end.
console.log(now() - start1);
这个例子里,前面一个统计,j定义在window作用域下;后面的统计,j的作用域在匿名function内。
1950195
trycatch
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
几百倍的效率差异,因此,我决定我尽量避免全局变量的运算。
有的人说了,你这个一下子就运行了10000次,在平时代码里很少出现,影响其实也不大。
嗯,这个问题,我是这样理解的:
我这里拿一个变量j赋值运算了
1000000
次(其实for之外还有一次,被我忽略),在我们的正常工作中,谁会循环1000000次呢?
不过,我们要知道全局定义的 Function 对象, Array 对象,我们依然经常使用,他们一样会对效率带来负面影响。
尽管如此,运算的次数也很有限,超过 10000次基本就是中型的js项目了(游戏,算法除外),所以在中型大型项目中,这个就比较重要了。
好,接下来分析原理。
1950195
trycatch
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
首先,全局变量相当于直接定义在window中,例如全局的j === window['j'];
给j做运算时候,js引擎先扫描作用域,最终定位到window['j'],这里浪费了资源。
具体是如何去做的,我也不懂,我只看结果。
那如果避免js引擎去全局扫描window对象?其实大家都用过这种技巧,也许没注意过罢了:
var start = now();
//block start:
var j = 0;
(function() {
var i = 0;
for (; i < 1000000; i++) {
window['j'] = i;
}
})();
//block end.
console.log(now() - start);
var start1 = now();
//block start:
var j = 0;
(function(window) {
var i = 0;
for (; i < 1000000; i++) {
window['j'] = i;
}
})(window);
//block end.
console.log(now() - start1);
大家看到,后面一个代码块,我给匿名函数传递了window参数,将window变成了局部变量。
结果显而易见,快了很多。
1950195
trycatch
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
总结:
在写代码的时候尽量在匿名函数里:
(function(window, undefined) {
/* 代码 */
})(window);
如果我们要用到 jQuery等类库,尽量这样写:
(function(window, $, undefined) {
/* 代码 */
})(window, jQuery);
这样效率多多少少都会比直接放在全局有所提升的。
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示