功能异议表示法?

时间:2012-02-22 17:38:23

标签: javascript function object notation

我想知道以这种格式编写javascript是否有任何性能/优势?

var myFuncs = {
  var firstFun = function() {
    // do something
  },

  var secondFunc = function() {
    // do something
  },

  var thirdFunc = function() {
    // do something
  }
}

所以他们可以被称为

myFuncs.firstFun();

我试图理解这是如何更有利[除了代码可读性]?

2 个答案:

答案 0 :(得分:3)

功能与对象声明

您不能使用该特定语法,正确的形式是:

var myFuncs = {
  firstFn: function () {},
  secondFn: function () {},
  ...
};

在对象中编写函数的优点与命名空间和上下文有关。如果你写了:

var firstFn = function () {};
-or-
function firstFn() {}

该函数将在window.firstFn定义。在myFuncs上添加功能可以在window.myFuncs.firstFn访问这些功能。如果您希望JavaScript与其他脚本一起使用,则不希望您的foo函数与某些elses foo函数冲突:

<script src="a.js">
function foo() {...}
</script>

<script src="b.js">
function foo() {...} //this script would overwrite the foo function in a.js
</script>

<script src="c.js">
var bar = { //this script would be accessed at bar.foo()
  foo: function () {..}
}
</script>

该函数的调用上下文(this)也将不同:

function foo() {
  console.log(this); //window
}
var bar = {
  foo: function () {
    console.log(this); //bar object
  }
}

关闭语法

你可能会感到困惑的是在闭包中声明函数的语法:

(function () {
  var foo = function () {...};
  foo();
}());

在这种情况下,闭包用于防止函数污染全局范围(window.foo将不会被设置)。这允许多个脚本使用相同的函数名称,而不必担心被覆盖。


OOP语法

对象语法通常用于定义JavaScript“构造函数”的原型。在JS中,只需在调用函数时使用new关键字,所有函数都可以作为构造函数调用:

function foo() {...}
var f = new foo(); //don't do it this way

为了可读性/可维护性/一致性,您应始终使用PascalCase命名构造函数:

function Foo() {...} //tells other developers this is a constructor
function bar() {...} //tells other developers this is a function
var f = new Foo();
var b = bar();

在原型如何工作的细节中不会过于迷失,您可以通过将对象分配给函数的prototype属性来指定要在函数的每个实例化对象之间共享的方法:

function Foo() {...}
Foo.prototype = { //note the use of the object declaration for the functions
  bar: function () {...},
  baz: function () {...},
  ...
};
var f = new Foo();
f.bar(); //calls the bar function that was defined in the prototype

答案 1 :(得分:0)

我认为你所要求的是在全局声明所有功能与将它们全部放入对象之间的优势。没有性能差异。人们通常建议将它们全部添加到对象中的主要原因是不会使全局空间混乱。

以这种方式思考。如果在javascript库中创建名为init的全局函数,并使其成为全局函数。然后,如果其他人也这样做,它将覆盖您的init。但是,如果你把它放在一个名为someJSLibrary的对象中,其他一些代码覆盖你的函数的几率要小得多。