我正在看一个示例,该示例取自O'Reilly出版的“ Javascript:权威指南”一书。这里报告了一个枚举函数:
function enumeration(namesToValues) {
// This is the dummy constructor function that will be the return value.
var enumeration = function() { throw "Can't Instantiate Enumerations"; };
// Enumerated values inherit from this object.
var proto = enumeration.prototype = {
constructor: enumeration, // Identify type
toString: function() { return this.name; }, // Return name
valueOf: function() { return this.value; }, // Return value
toJSON: function() { return this.name; } // For serialization
};
enumeration.values = []; // An array of the enumerated value objects
// Now create the instances of this new type.
for(name in namesToValues) { // For each value
var e = inherit(proto); // Create an object to represent it
e.name = name; // Give it a name
e.value = namesToValues[name]; // And a value
enumeration[name] = e; // Make it a property of constructor
enumeration.values.push(e); // And store in the values array
}
// A class method for iterating the instances of the class
enumeration.foreach = function(f,c) {
for(var i = 0; i < this.values.length; i++) f.call(c,this.values[i]);
};
// Return the constructor that identifies the new type
return enumeration;
}
至少我感到困惑。
在这里,我们在第一行报告一个
enumeration
函数,在该函数的内部有一个名称完全相同的构造函数。我假设我们不是在指同一个函数(从全局环境中调用将调用第一行enumeration
而不是构造函数,对吗?)。我们将
proto
分配给enumeration.prototype
。我们现在指的是什么?我们是在第一行的enumeration.prototype
函数中还是在第三行的构造函数中添加enumeration
属性?然后,我们将
enumeration
构造函数分配给constructor
属性。为什么它引用第三行而不是第一行enumeration
的构造函数?是因为构造函数在内部范围内吗?然后我们声明
enumeration.values
。再次在第一行向函数添加属性吗?最后,函数返回什么?本身?一个东西?
我没有使用javascript的经验,因此可能缺少明显的细节。
最佳答案
据我所知,有一个要点使您感到困惑:enumeration
的两种用法。
为了便于解释,我将在第一行enumeration
上调用outerEnumeration
,在第三行innerEnumeration
上调用。
我假设我们不是在指相同的功能
是的,它们确实是两个不同的功能
在全局范围内,是的,enumeration
将引用第一行中声明的函数(又名outerEnumeration
)。如果没有var enumeration
声明,则enumeration
中的outerEnumeration
也将引用自身。
但是由于var enumeration
是在函数作用域内声明的,因此它具有优先权。因此,存在一个innerEnumeration
,它由变量enumeration
引用:
var enumeration = function() { throw "Can't Instantiate Enumerations"; };
您可能想take a closer look at JavaScript scope更好地了解当前的问题。
我们将原型分配给enumeration.prototype。我们现在指的是什么?
到
innerEnumeration
var enumeration
声明在outerEnumeration
的整个函数体内都是有效的,因为它在任何地方都不会被覆盖。然后,我们将枚举构造函数分配给Constructor属性。为什么它引用第三行的构造函数而不引用第一行的枚举?
与上述相同的原因
然后,我们声明enumeration.values。再次在第一行向函数添加属性吗?
同样,
innerEnumeration
函数对象最后,函数返回什么?本身?一个东西?
innerEnumeration
它返回
innerEnumeration
函数及其所有属性(.prototype
,.values
等)。然后,可以创建innerEnumeration
的实例。例如通过:new enumeration(namesToValues);
要么
Object.create(enumeration.prototype).constructor(namesToValues);
(此处
enumeration
指的是outerEnumeration
)。我希望这可以帮助您更好地了解此功能的内部运作方式。您还有其他问题吗?
关于javascript - 枚举类型的范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33148444/