网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
成为超级会员,使用一键签到
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
11月12日
漏签
0
天
javascript吧
关注:
269,170
贴子:
906,434
看贴
图片
吧主推荐
游戏
1
2
下一页
尾页
36
回复贴,共
2
页
,跳到
页
确定
<<返回javascript吧
>0< 加载中...
闲来无事,聊聊Javascript减少全局变量对效率的提升
只看楼主
收藏
回复
1950195
trycatch
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
年底,终于看似闲下来了,整理下初学js的心得,和大家分享一下。度娘威武!
1950195
trycatch
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
判断效率的依据还是用普遍的方法——运行时间比较。
这里先定义一个function,return 一个时间毫秒整数:
function now() {
return new Date().getTime();
}
执行 now()得到当前毫秒数;
在代码块前后分别调用,相减所得的值即代码块执行消耗的时间。
2025-11-12 17:25:54
广告
不感兴趣
开通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项目了(游戏,算法除外),所以在中型大型项目中,这个就比较重要了。
好,接下来分析原理。
hzwzjwy
Boolean
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
好帖支持
宠奶奶爱夫人
for
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
学习了!呵呵,,,不小心夹了。。
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变成了局部变量。
结果显而易见,快了很多。
2025-11-12 17:19:54
广告
不感兴趣
开通SVIP免广告
1950195
trycatch
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
总结:
在写代码的时候尽量在匿名函数里:
(function(window, undefined) {
/* 代码 */
})(window);
如果我们要用到 jQuery等类库,尽量这样写:
(function(window, $, undefined) {
/* 代码 */
})(window, jQuery);
这样效率多多少少都会比直接放在全局有所提升的。
gainover
Error
10
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
好帖。
zgh26782000
Date
13
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
萨依法
Boolean
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
次碳酸钴
Number
12
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
其实还有引擎原因,在FF上全局变量的访问速度是很快的,其它浏览器就稍逊色。。
WISD0M
false
3
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
不在于是全局还是局部变量, 我把你的代码在Chrome25里运行了一下, 数字是3ms, 只需要把 j = i 这样写, 如果写成window["j"] = i;就是50多, 差了10多倍, 但是显然是因为window["j"]赋值每次都会搜索属性. 和变量是否全局没有关系. 把window作为参数传进去会比不传快一倍, 但是这可能是因为, 赋值的时候首先要对window对象进行一些操作(或许是查找window是否是window的属性),传为局部变量, window本身就确定了, 所以快一点.
2025-11-12 17:13:54
广告
不感兴趣
开通SVIP免广告
WISD0M
false
3
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
至少在chrome浏览器上, 全局运算比函数内部循环慢一倍, 这可能是同样的原因, 全局的时候,需呀判断每个变量是否是window的属性, 如果你的变量名是一个全局对象, 比如document和普通的是不同的, 但是在局部使用了var的时候, 就不需要判断了.
var document = "abc";
alert(document);
这两句代码在全局和函数内部是不同的, 全局的时候, document仍然是内置对象, 不能被赋值,也就是说, 全局的时候, 肯定要对变量进行一些额外的判断.
目前比较先进的是V8引擎, 现在的ie9引擎也足够快, 好像还有一个在研发的新引擎, 声称比V8 还快. 但是我觉得, 大幅提高的可能性不大了, 因为代码优化不是无止境的, 只不过早先的JavaScript引擎太慢了, ie6比现在的引擎慢1000倍不稀奇.
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示