这段代码来自this answer。
我正在努力了解它是如何运作的,但我并没有完全了解它。
我认为发生的事情是TEST_ERROR是一个闭包因此无法更改ErrorValue。一个人会引用这样的值:TEST_ERROR.SUCCESS。如果其中任何一个陈述不正确,请纠正我。
我不明白的是返回声明正在做什么。它返回一个由不同的ErrorValues组成的对象,但是将它返回到什么状态?它是从什么回来的?什么时候被召唤?
var TEST_ERROR = (function() {
function ErrorValue(value, friendly) {
this.value = value;
this.friendly = friendly;
}
ErrorValue.prototype = {
toString: function() { return this.friendly; },
valueOf: function() { return this.value; }
};
return {
'SUCCESS': new ErrorValue(0, 'Success'),
'FAIL': new ErrorValue(1, 'Fail'),
'ID_ERROR': new ErrorValue(2, 'ID error')
};
})();
谢谢!
保
答案 0 :(得分:6)
TEST_ERROR是一个闭包,因此无法更改ErrorValue。
TEST_ERROR最终将成为匿名函数内return语句中指定的对象。 可以更改此对象。
可以引用这样的值:TEST_ERROR.SUCCESS
这是正确的。
我不明白的是什么 return语句正在做。它的 返回由...组成的对象 不同的ErrorValues,但返回 它到底是什么?什么回来了 从?什么时候被召唤?
return语句从使用
声明的anonymous function返回 (function() { ...})();
最后的()
表示匿名函数在声明后被称为立即,并且return
块内的值被赋值给{{1 }}
Here是关于闭包和模拟可能有用的私有变量的好文章。
答案 1 :(得分:2)
它将结果返回到TEST_ERROR
var TEST_ERROR =
立刻被召唤:
})();
这是一种常见的javascript模式。您只为其提供的隐私/范围创建匿名函数,然后立即执行它而不是保留它。
答案 2 :(得分:1)
此代码创建一个名为TEST_ERROR
的类。函数ErrorValue
是类的构造函数,它定义了两个属性:value
和friendly
。该类有两个函数:toString
(对于任何给定的实例返回friendly
)和valueOf
(对于任何给定的实例返回value
)。最后,这个类声明了三个类级属性(SUCESS
,FAIL
和ID_ERROR
),可以在没有该类实例的情况下访问(类似于C#的static
成员)
答案 3 :(得分:0)
var TEST_ERROR = ( // these parenthesis evaluate the function expression
function() { // anonymous function
function ErrorValue(value, friendly) {
this.value = value;
this.friendly = friendly;
}
ErrorValue.prototype = {
toString: function() { return this.friendly; },
valueOf: function() { return this.value; }
};
// return an object from the function
return {
'SUCCESS': new ErrorValue(0, 'Success'),
'FAIL': new ErrorValue(1, 'Fail'),
'ID_ERROR': new ErrorValue(2, 'ID error')
};
}
)
(); // call the evaluated function which returns the "enum" object and assign
// that value to TEST_ERROR
所以是的TEST_ERROR
将是{SUCCESS: ..., FAIL: ..., ID_ERROR: ...}
,因为您无法访问ErrorValue
,所以您无法搞清楚自己的价值。
答案 4 :(得分:0)
是的,它本质上是返回一个具有三个成员SUCCESS,FAIL,ID_ERROR的Object,每个成员代表一个ErrorValue。在javascript中,我们可以通过点表示法或索引器访问成员。
无法在对象外部实例化ErrorValue,因为它的范围有限......
答案 5 :(得分:0)
我非常(非常)确定您仍然可以更改值:
TEST_ERROR.FAIL.value = 7;