2011-06-14 146 views
9

任何人都可以解释为什么下面两个不相等?我基本上试图弄清楚幕后发生了什么。我的理解是,他们都提到相同的功能,但似乎并非如此。函数参考 - 请指教!

var foo = function bar() {} 

typeof foo //"function" 
typeof bar //"function" 

foo === bar //false 
foo == bar //false 
+2

你是否按照我们看到的顺序执行它? – 2011-06-14 16:04:01

+0

只是FYI,如果你想让它们引用相同的函数,你需要'var foo = function(){},bar = foo;'或'bar(){}; var foo = bar'。那么如果你比较它们,它们将是平等的。 – brymck 2011-06-14 16:19:50

+1

您必须使用IE8或更低版本。这是一个已知的错误,不仅“bar”泄漏到封闭变量作用域中,而且还创建了一个唯一的函数对象并将其分配给“bar”。这就是为什么'bar'是一个函数,但'foo'不等于'bar'。 – user113716 2011-06-14 16:43:09

回答

5

我不知道你,但我的浏览器为typeof bar

typeof bar //"undefined" 

演示http://jsfiddle.net/gaby/t8Czr/


bar参考方法仅仅是方法本身内部提供返回undefined ..

+0

你说得对。我正在阅读一篇文章并在Firebug控制台中进行测试,并认为我得到了我目睹的结果。不幸的是,我执行的确切代码不再存在。 – 2011-06-14 17:01:43

2

Bar i没有定义。酒吧只存在于foo的范围内。

如果您先声明酒吧,然后设置foo等于酒吧,您的结果将如预期。

2

由于赋值为foo,这是一个命名函数表达式。在一个命名的函数表达式中,函数的名称仅在函数本身的封闭范围内可用,但不在外部。

外面它将简单地是未定义的。

var foo = function bar() { typeof bar; /* function */ }; 
bar; // undefined 

只好分配给foo没有去过那里,这将是一个函数声明和标识符bar想在整个封闭的范围已面市,被宣布为功能,甚至之前。

typeof bar; // function 
function bar() {} 

这是一个good article理解命名函数表达式的工作,他们从函数声明的区别。