0

当我在 JS 中开发时,我经常面临使用内部函数(闭包)捕获变量和使用对象之间的选择。

内部功能:

var x = ...;
var f = function() {
    // use x here
}

目的:

obj.x = ...;
obj.f = function() {
    // use x here
}

内部函数方法“感觉”更自然,但我想知道 - 担心以一种或另一种方式执行它是否会对性能产生影响,以及做这种事情最惯用的方式是什么?

4

2 回答 2

2

在一个普通 PC 有 8GB RAM 的时代,闭包与对象属性的内存使用似乎无关紧要。无论如何,在一个重要的应用程序中,仅使用闭包或仅使用属性值是非常不可能的。

如果您有一个代码模块,则对仅由该模块的方法在内部使用的变量使用闭包是有意义的。对需要跨模块共享的值使用属性也很有意义,而无需使用 getter 和 setter(例如,您想在哪里使用obj.property而不是obj.getProperty())。

此外,属性访问比使用函数检索值更有效,但 getter 和 setter 可以提供重要的功能(例如值验证和完整性检查),而不是简单地读取或分配值。

与往常一样,根据任何看起来合适的标准(速度、代码可维护性、健壮性、跨浏览器支持等)使用适合您的应用程序的东西。

于 2013-06-26T23:42:27.900 回答
1

好吧,实际上您在第二种情况下分配了额外的对象,否则它们在我看来是一样的。

函数是 JS 中的第一类对象,很容易忘记,每当您看到function(){}它分配了一个相对较胖的新函数对象时。new Function()如果这使对象分配对您更明显,您可以将其视为被调用。

仅当您有一个在其中定义函数并返回指向这些函数的对象的“构造函数”时,这才是有害的。这些函数中的每一个都是在您从构造函数创建的对象之上创建的单独对象。这些函数很容易占用比对象及其数据本身多 10-100 倍的内存,当然这取决于数据和方法的数量。

如果您正在编写一个应用程序,很容易考虑您是否需要担心它。如果您知道您的应用程序根本不会创建许多对象,那么从大局来看,内存的浪费并不是那么糟糕。如果您正在编写通用库等,请不要为您无法预测需求的应用程序开发人员做出这些假设。

于 2013-06-26T23:11:38.667 回答