2010-06-11 131 views
2
奇怪的行为

我写的代码,这个和平:Chrome和Safari浏览器的Javascript

var a=function(){ 
}; 

a.name="test"; 
a.prop="test2"; 

现在,如果我调试与控制台的代码:

console.log(a.name); 
console.log(a.prop); 

在Firefox中,我得到a.name="test"a.prop="test2" ,而在Safari和Chrome我得到a.prop="test2",但​​。

似乎没有办法在Webkit浏览器中为函数分配“name”属性。你知道为什么吗?但最重要的是,你知道一个解决方法吗?

+0

确认5.0.375.70。我尝试在'.function(){}'中分配.name,即使这样也行不通。 – 2010-06-11 13:39:31

回答

6

功能情况有一个非标准name属性,它会返回函数的名称,或一个空字符串,如果该函数是匿名的(像你这样)。当您尝试写入属性时,浏览器的反应会不同,因此我建议使用另一个属性名称。

+0

我认为你是对的。那么没有办法解决这个问题了吗? – mck89 2010-06-11 13:52:13

0

一些单词在JS中保留,但一些浏览器仍然支持它们。

到这里看看:http://www.quackit.com/javascript/javascript_reserved_words.cfm

+2

无关紧要。 'name'不是JavaScript中的保留字。问题是Function对象在某些浏览器中已经具有'name'属性。 – 2010-06-11 13:41:45

+0

即使'name'是一个保留字,它也无关紧要,因为您可以使用保留字作为属性名称。 – 2010-06-11 13:47:19

0

你为什么要将属性赋值给方法?这看起来应该是违反某些程序或惯例。如果你想要一个方法和属性都可用,请创建一个新对象来包含它们。

+4

功能是对象,可以很高兴地分配给它们的属性。只要你避免试图覆盖诸如'name'这样的内置属性,这是一个完全可以接受的事情。 – 2010-06-11 13:43:10

0

看来您不能更改匿名/ lambda函数的名称。如果您想设置名称,则需要执行类似var a=function b() {}的操作,然后您可以设置名称。

+0

我不这么认为。至少在Chrome中,名称属性仍然是只读的。 – 2010-06-11 13:49:34

0

正如你可以看到, “名” 是不是一种选择,那么:

var a = function(){ 
}; 


a.props={name:"test",prop:"test2",anyKey:"anyValue"}; 

可能是一个解决办法。