网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数: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
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 1 2 下一页 尾页
  • 36回复贴,共2页
  • ,跳到 页  
<<返回javascript吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示