Javascript命名函数表达式,引用错误

时间:2014-08-29 19:23:33

标签: node.js google-chrome javascript javascript-objects

我得到"参考错误"使用以下代码非常随机(大约每200次尝试一次)。

var securityPrototype = {   
    init: function(){ /* ... */ },
    encryptionKey: function x() {
        var i = x.identifier; 
        return getKey(i);
    }
}

securityPrototype.encryptionKey.identifier = Date.now();

function Security(){}

Security.prototype = securityPrototype;
Security.constructor = Security;

function getKey(){ /* ... */ }

var gate = new Security()
gate.encryptionKey();  // Randomly throws : ReferenceError: x is not defined

此代码段位于其他代码中,但没有" eval"正在使用,而不是'与'操作

我试图弄清楚是否由于任何条件,这里可能会出现此错误。

重现此功能的浏览器:Mac和Windows上的Chrome。 IE和Safari工作正常。

1 个答案:

答案 0 :(得分:1)

这是因为在某些浏览器的某些版本中存在命名函数表达式的实现中的错误。

在这些浏览器中,使用命名函数表达式时会创建两个单独的函数对象。属性gate.encryptionKey是对一个函数对象的引用,名称x是对不同函数对象的引用。它们都包含相同的代码,但它们是Function类的不同实例。

将值赋给gate.encryptionKey.identifier时,该属性仅在gate.encryptionKey引用的函数对象中可用。 x引用的函数对象没有该属性。

这些浏览器中的行为的简单示例:

var f = function g(){};
f === g; // false

f.expando = 'foo';
g.expando; // undefined

此示例(示例#3)取自页面Named function expressions demystified,您可以在其中阅读有关命名函数表达式和实现错误的更多信息。