使用var和使用function声明JavaScript对象有什么区别?

7

我是一个困惑的新手。我在教程中读到,你可以这样创建一个JavaScript对象:

function myObject() {
    this.myProperty = "a string";
    this.myMethod = function () {
        //Method code
    }
}

然后我在其他地方读到,可以通过以下方式创建一个对象:

var myObject = {
    myProperty: "a string",
    myMethod : function () {
        //Method code
    }
}

这两者之间的(非主观)区别是什么?是否有官方的正确方式和错误方式?

3个回答

5

这两种声明都是正确的,但它们有不同的语义。

第一种声明允许您创建对象的实例:

var t = new myObject();
// then use t
t.myProperty = "some value";

var otherT = new myObject();
otherT.myProperty = "some other value";

第二个对象几乎像是一个静态对象:
myObject.myProperty = "some value";

1
我更愿意称第二个为没有构造函数的“单例模式”。 - gblazex
谢谢你将其与静态对象进行比较。这是一个很好的解释方式。 - randomable

3

这里是一个直接的比较...

function myObject() {

这将在解析 JavaScript 时声明该函数...
var myObject = function () {

这在运行时声明函数。

如果您使用“var”方法,则必须在使用之前声明函数...请尝试此示例。

myFunction(); // Works
myVarFunction(); // Boom

var myVarFunction = function () { alert("Hi"); };

function myFunction() { alert("Hi"); };

如果你必须更加小心地使用它,那么为什么要使用“var”方法呢?这与作用域有关...作用域函数被认为是更好的。

更新:这里有一些很好的解释:

var functionName = function() {} vs function functionName() {}


谢谢你提供的链接!其中一个答案说var有作用域,但另一个答案进行了更正,表示它们都有作用域。我进行了测试,发现var和function的作用域方式相同。除非有其他条件,否则两者作用域应该是一样的。 - randomable
@randomable - 是的,在这种情况下,作用域似乎会引起混淆...我可能是另一个受害者。看看这个:https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope - Fenton

0

这两者之间的主要区别在于一个变量是局部的,另一个是全局的。“var”基本上定义了变量的作用域。

当我们将var添加到变量值分配中时,javascript确保该变量被限制在其分配的任何函数中,并且不会与另一个函数中具有相同名称的变量发生冲突。

当我们不使用var时,它被声明为全局函数,可能会发生冲突。因此,在变量值分配之前始终建议使用“var”。如果需要,可以使用匿名函数进行闭包。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接