添加值以充当对象

时间:2014-01-28 19:06:47

标签: javascript function object

在JavaScript中,函数是对象,正如Crockford先生所写,下面的两个符号是等价的:

function funct1(){};

var funct = function funct1(){};

因此,当我将单个函数(不是全局对象)视为一个对象的变量时,它可以工作,我的示例如下所示:

function testFunction(){
    var variable = "value"; 
}
testFunction.value1 = "value1";

function testFunction2(){
    var variable = "value2";    
}

alert(testFunction.value1); //returns "value1"

setTimeout(function(){
    alert("setTimeout 5001: " + testFunction.value1); //returns "value1"
    alert("setTimeout 5001 function2: " + testFunction2.value1); //returns "undefined"
},5001);

我使用setTimeout来确保函数执行完成(可能时间设置不足以进行'真实'测试?)。

这看起来像是一种在函数执行之外存储值的有趣方式(因为一旦函数终止并且计算的值将被检索)。这是正确的吗?它是一种既定的编码实践吗?

我看到的一个问题是存在内存泄漏的可能性,因为一旦大量数据开始被存储并被遗忘,这些将会出现并导致脚本缓慢。这是真的?对象变量是否存在相同的问题(如key:value对的变量)?

我以前没见过这个。

1 个答案:

答案 0 :(得分:0)

  

我使用了setTimeout来确保函数执行完成(可能时间设置不够长,无法进行真正的测试?)。

这是不必要的。您的示例代码将同步执行,您不需要等待"任何事情。

  

这看起来像是一种在函数执行之外存储值的有趣方法。它是一种既定的编码实践吗?

是。这通常是针对与函数相关的静态值完成的,这些静态值应该是可公开访问的,并且不会污染范围。在构造函数或"可调用模块上非常常见"。

  

就像一个函数终止并且计算出的值一样。这是正确的吗?

没有。函数计算的值应为return。将它存储在静态位置是一个非常糟糕的主意,因为函数的多次调用可能会相互干扰。

  

我看到的一个问题是存在内存泄漏的可能性,因为一旦大量数据开始被存储并被遗忘,这些将会出现并导致脚本缓慢。这是真的吗?

是。但是,只有在您不希望忘记它时,才将其存储在非收集的属性上。你不会用大数据来做这件事。

  

对象变量是否存在相同的问题(如带有键:值对的变量)?

这些被称为属性,但是是的。唯一的区别是功能对象通常比普通对象长寿(由于它们的使用,它们不会被GC处理得不同)