在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
对的变量)?
我以前没见过这个。
答案 0 :(得分:0)
我使用了setTimeout来确保函数执行完成(可能时间设置不够长,无法进行真正的测试?)。
这是不必要的。您的示例代码将同步执行,您不需要等待"任何事情。
这看起来像是一种在函数执行之外存储值的有趣方法。它是一种既定的编码实践吗?
是。这通常是针对与函数相关的静态值完成的,这些静态值应该是可公开访问的,并且不会污染范围。在构造函数或"可调用模块上非常常见"。
就像一个函数终止并且计算出的值一样。这是正确的吗?
没有。函数计算的值应为return
。将它存储在静态位置是一个非常糟糕的主意,因为函数的多次调用可能会相互干扰。
我看到的一个问题是存在内存泄漏的可能性,因为一旦大量数据开始被存储并被遗忘,这些将会出现并导致脚本缓慢。这是真的吗?
是。但是,只有在您不希望忘记它时,才将其存储在非收集的属性上。你不会用大数据来做这件事。
对象变量是否存在相同的问题(如带有键:值对的变量)?
这些被称为属性,但是是的。唯一的区别是功能对象通常比普通对象长寿(由于它们的使用,它们不会被GC处理得不同)