2017-01-12 116 views
-2

我很困惑,为什么foo2的作品,但不foo1。JavaScript函数声明问题

JS小提琴:https://jsfiddle.net/474v3mfd/4/

HTML

<a onclick="foo1()"> 
    foo1 
</a> 
<a onclick="foo2()"> 
    foo2 
</a> 

的Javascript

function foo1(){ 
    console.log("foo1 called.."); 
} 

foo2 = function(){ 
    console.log("foo2 called.."); 
} 

控制台日志

(index):60 Uncaught ReferenceError: foo1 is not defined at HTMLAnchorElement.onclick ((index):60) onclick @ (index):60 (index):50 foo2 called..

摘要

该问题是特定于JSFiddle。当我把代码放入HTML文件时,它工作正常。

+1

你必须表现得更加完整的例子,但我的猜测是,该代码是在函数内部(例如onload事件),所以'foo1'是本地和'foo2'是全球性的。 – JJJ

+0

**首先:**确保脚本在'a'标签之前加载。虽然它没有建议。你应该使用'.addEventListener'来绑定事件。 **第二:**声明不带'var'的变量将使其成为全局变量。 – Rajesh

+0

添加JS小提琴。 https://jsfiddle.net/474v3mfd/4/ –

回答

0

这是哪里的功能已申报范围问题。 如果你在浏览器中运行这个代码,它将工作得很好,因为函数和函数表达式都在全局范围内声明。

,但在这里拨弄它的失败作为函数表达式已被分配给一个全局变量“foo2的”所以它的方便,但功能foo1不可在拨弄范围。

如果你做如下,通过使用VAR创建变量foo2的,它会得到创建成不同幅度(没有更多的全球),这就是为什么它会抛出相同的错误foo1。

var foo2 = function(){ 
    console.log("foo2 called.."); 
} 

更新小提琴 - https://jsfiddle.net/474v3mfd/6/

希望它帮助。