为什么这个变量没有被初始化?

问题描述:

在我的网页<head>,我这样做:为什么这个变量没有被初始化?

<script type="text/javascript" src="js/foo.js"></script> 
<script type="text/javascript"> 
    console.log(foo.bar); 
</script> 

foo.js代码:

var foo = function() 
{ 
    this.bar = function() 
    { 
     console.log('here'); 
    } 
} 

后来在HTML文档中:

<a href="#" onclick="foo.bar();">Test</a> 

但是如果我点击链接上面,它表示函数没有定义,即使foo.js已包含在内。此外,如果我做console.log(foo)它只显示'功能()'和console.log(foo.bar)显示未定义。为什么是这个,为什么我不能访问这个函数?

+1

我不会进入编辑大战,但是网络开发标签太宽泛,没有任何形式的真正用处。这个问题甚至没有针对Web开发,它纯粹是JavaScript。另外,这与jQuery无关。 – JJJ

+1

@Juhana:确实;-) – zerkms

+1

它也不是jQuery! – ErJab

我不知道,如果你想这样说,但让你console.log(foo.bar);工作,你可以这样做:

var foo = { 
    bar: function() { 
     console.log('here'); 
    } 
}; 

因为您还没有创建对象。这是运行你的代码的正确方式:

var foo = function() 
{ 
    this.bar = function() 
    { 
     console.log('here'); 
    } 
} 

var instance = new foo(); 
instance.bar(); 

http://jsfiddle.net/zerkms/wDaEn/

或者,你可以用另一种方式定义它:

var foo = { 
    bar: function() { 
     console.log('here'); 
    } 
}; 

foo.bar();​ 

http://jsfiddle.net/zerkms/wDaEn/1/

由于您使用this和创建实例类成员,您需要实例类第一:

var fooClass = new foo; 
console.log(fooClass.bar()); 
+0

如果我不想这样初始化它,我需要做什么? –

+0

@ClickUpvote:不要在你的对象中使用'this'关键字,例如'bar:function(){console.log('here'); }' – Sarfraz

+0

然后我怎么能够在超链接的onclick中调用'foo'对象的'bar'函数?现在我正在做'' –

foo.js内容只是初始化foo的一个函数,直到foo()叫...什么是在implentation没有意义。 所以foo.bar是未定义的。

以上的答案是不正确的,记住JavaScript有没有概念类或所述类别的实例。我会做一些关于Javascript范围和关闭的阅读。

当您将对象分配给变量名称栏时,您将它分配给本地范围。然后您尝试从全局上下文访问您的本地函数。这是错误的。

我敢打赌你正试图沿着下面的内容: -

var foo = { 
     bar: function() { 

     } 
} 

等...

最少的代码更改使用以下命令:

<script type="text/javascript"> 
    var foo = function() 
    { 
     this.bar = function() 
     { 
      console.log('here'); 
     }; 
     return this; // magic yes ? 
    }; 


foo().bar(); 
</script>