【问题标题】:What's the difference between defining these objects? [duplicate]定义这些对象有什么区别? [复制]
【发布时间】:2012-08-09 07:05:28
【问题描述】:

这些有什么区别?

var person = {
    age: 25,
    name: "David"
};

var person = (function() {
    var name = "David", age = 25;
}());

我的问题是,(function(){}()) 是做什么的?

【问题讨论】:

  • 对我来说这是一个非常有趣的话题。我发现这个网站可以说明你的问题。 phpied.com/3-ways-to-define-a-javascript-class
  • 我认为你错过了“大卫”的一句话
  • 两个语句做的事情完全不同,比较它们是没有意义的。第一个创建一个对象,第二个执行一个函数,将返回值(undefined)分配给person
  • @FelixKling:这应该是公认的答案。我希望在提交 a wrong one 之前看到您的评论(或更好地阅读问题)

标签: javascript


【解决方案1】:

(function(){}()) 有什么作用?

这实质上是创建一个匿名函数,然后执行它。这样做的一个常见用途是限制全局变量。

例如,以下将具有三个全局变量(var1var2var3):

var var1 = "a", var2 = "b", var3 = "c";

如果您将这些声明包装在匿名函数中,它们仍然可以作为匿名函数中的局部变量访问,但不会混淆全局命名空间。例如:

(function() {
    var var1 = "a", var2 = "b", var3 = "c";
    console.log(var1); // interact with local variables
})(); // execute function.

这些有什么区别?

var person = {
    age: 25,
    name: "David"
};

如果此代码包含在函数中,它会创建一个名为 person 的局部变量。否则,它会创建一个名为 person 的全局变量。

var person = (function() {
    var name = "David", age = 25;
}());

此代码创建并执行一个匿名函数,然后将该匿名函数的返回代码分配给变量person。由于匿名函数没有返回值,所以变量person 的值为undefined。就目前而言,这条语句在功能上等同于 var person;,因为匿名函数没有副作用,也没有返回值。

【讨论】:

  • 说对象字面量和匿名函数中都有方法,即 getName()。我仍然可以从任一声明中访问 person.getName() .. 那么这两个代码最终实现了同样的事情吗?
  • 非常详尽简洁,谢谢!
  • @anonymous - 除非在匿名函数中以某种方式返回了一个对象,否则您不能使用person.getName(),因此它们并不完全相同。如果你想使用匿名函数版本中的person.getName(),你可以使用这个:var person = (function() { this.getName = function() { return "Bob" }; return this; })();
【解决方案2】:
var person = (function() {
    var name = "David", age = 25;
}());

person 将是 undefined,因为该函数没有 return 语句。

它只是一个自我执行的匿名函数,您可以如下图所示。

function foo() {
  var name = "David", age = 25;
}
var person = foo();

【讨论】:

  • +1 用于在 new 关键字未与构造函数一起使用时提及变量的 undefined
【解决方案3】:

它执行你刚刚创建的匿名函数。

这种技术很有用,因为它允许您在类中限定成员。

如果您正在寻找一种处理类和继承的好方法,请查看http://ejohn.org/blog/simple-javascript-inheritance/

我还建议将您的类定义为 AMD 模块。

【讨论】:

  • 立即执行的函数与“类”有什么关系?我同意,它对范围界定很有用,但我不明白你为什么要引入课程。
  • @Felix Kling 只是按照问题的标题。他正在尝试定义对象...不妨谈谈类。
  • 我不明白它如何与构造函数一起使用,以及它带来了哪些好处。需要详细说明吗?
  • @Felix Kling 诚然,我对 JS 知之甚少。但是构造函数对我来说很像一个类定义。至少在 Java 意义上的类。当然,它的“类型”部分除外。想法?
  • OP 的示例不是构造函数,除非在调用函数时将代码更改为使用 new - 在这种情况下,它仍然不会做与对象文字相同的事情,因为创建变量函数内部带有var 不会将它们作为属性添加到返回的对象中。
猜你喜欢
  • 2016-09-07
  • 1970-01-01
  • 2013-11-12
  • 2013-08-07
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
相关资源
最近更新 更多