Javascript全局上下文的变量对象与函数激活对象
Javascript global context’s variable object vs function activation object
以下是js代码的两个示例:
A。函数_foo是在全局上下文中定义的
function _foo(){ //some code here
}
//... some unrelated code here
var foo = function(){
var result = _foo();
return result;
}
B。函数_foo在函数上下文中定义
var foo = function(){
function _foo(){ //some code here
}
var result = _foo();
return result;
};
在内存管理方面,哪一个是更好的编程实践?由于函数foo
在应用程序中会被多次调用,是否最好将_foo
保留在(应用程序的)全局上下文中,而不是每次调用foo
时都在函数上下文中创建它?或者,由于_foo
将(主要)在foo
内部使用,因此将其保留为激活对象的一部分是有意义的?
C:缓存
var foo = (function(){
function _foo(){ //some code here
}
return function() {
var result = _foo();
return result;
}
}());
Foo被立即执行,并且函数_foo
只被声明一次。
在现代浏览器中,这比"全局"功能慢5%。
相关基准
要直接回答您的问题,如果每次要调用foo
对象时都必须实例化它,那么在全局范围内声明它肯定是一个更快的选择。
然而,从性能的角度来看,在JavaScript中几乎肯定会有更快的胜利,通常与DOM交互有关。
在这类示例中,我建议您坚持最佳编程实践。如果这是C#、Java或其他更强类型的语言,你会怎么做?好吧,你不能声明一个全局函数,所以你可以把它放在一个类中,要么作为静态方法,要么作为公共方法:
var foo = function(){};
//static method
foo._foo = function(){
alert("_foo");
};
//public method
foo.prototype._foo2 = function(){
alert("_foo2");
};
//calling static method
foo._foo();
//instantiating and calling public method:
var f = new foo();
f._foo2();
//note: this won't work (as we would expect!)
foo._foo2();
大多数这样的事情都是一种权衡,在这里偏爱风格和结构而不是性能是一个好的选择。
尝试在全局上下文上创建函数,并使用闭包函数作为特定于原始函数请求的异步回调。过多的匿名函数调用可能会导致严重的内存泄漏,因为javascript会保留您在闭包中使用的顶级变量。
如果您试图以OO风格为私有成员进行设计,您可能还希望使用闭包函数。在"面向对象的javascript"上进行一些Google/Stackoverflow搜索,可以获得更多关于该特定主题的设计帮助。
MDN报价:
https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope
闭包会占用大量内存。只有当返回的内存不再可访问时,才能释放内存。。。由于这种低效性,请尽可能避免闭包,即尽可能避免嵌套函数。
同样,考虑OO设计是好的。。。将函数封装到一个对象中,这样就可以静态地或通过对象引用来调用它们,这也是一个很好的设计。
- 引用对象中的通用值
- jQuery匹配JSON对象的部分文本
- 节点导出返回一个空对象
- 如何在Javascript中将JSon对象转换为数组
- 我可以在json对象中添加一个函数吗
- 使用JS将数组转换为json对象
- 全局变量和全局对象的属性之间有什么区别吗
- 比较从函数和生成的日期对象
- Javascript,访问一个主要对象模块模式中的每个对象
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- 调整窗口大小时,可拖动的对象会出现在容器外部
- 如何使用javascript从主svg对象动态创建svg视图框
- 如何使用json将对象列表从java转换为javascript
- 激活chrome上的chrome.notifications对象
- 激活变为翡翠中的[对象对象]
- 如何使用日期对象在特定时间激活音频文件
- 什么是声明性环境记录,它与激活对象有何不同
- 避免在重新激活视图时从头开始重新渲染闪光对象
- 对象的属性在改变时激活功能
- Javascript全局上下文的变量对象与函数激活对象