我想知道以这种格式编写javascript是否有任何性能/优势?
var myFuncs = {
var firstFun = function() {
// do something
},
var secondFunc = function() {
// do something
},
var thirdFunc = function() {
// do something
}
}
所以他们可以被称为
myFuncs.firstFun();
我试图理解这是如何更有利[除了代码可读性]?
答案 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
将不会被设置)。这允许多个脚本使用相同的函数名称,而不必担心被覆盖。
对象语法通常用于定义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
的对象中,其他一些代码覆盖你的函数的几率要小得多。