我正在看一个示例,该示例取自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/

10-12 12:19