我对这些javascript初始化使用哪个(如果有的话)有点混淆,因为从我可以tel,他们都做同样的事情。在哪些情况下我应该使用一个或另一个? Mt项目要求我将多个函数和命名空间封装在一个对象中,这样我们就不会在变量名称中混淆全局范围,因此我对+ function(){}()之间的差异特别不清楚。和(function())();
非常感谢任何帮助。请记住,最终目标是将所有函数封装在单个命名空间中。 IE MyCompany.function,MyCompany.Namepsace.Function ......
<script>
var Ford = {};
+function() {
Ford.start = function() {
console.log("Ford just started");
};
}();
Ford.start();
</script>
<script>
var Honda = {};
(function() {
Honda.start = function() {
console.log("Honda just srtarted");
};
})();
Honda.start();
</script>
<script>
var Toyota = function() {
return {
start: function() {
console.log("Toyota just strted");
}
};
}
var car = new Toyota();
car.start();
</script>
答案 0 :(得分:2)
当使用new
关键字时,Javascript函数仅作为构造函数调用。 new
创建一个新的对象实例,继承自构造函数的原型,并使this
关键字的上下文成为新创建的对象实例。因此,如果您没有使用原型继承属性或关键字this
来在构造函数中创建新属性 - 您实际上不需要使用构造函数。
我认为你要找的是使用module pattern实现的immediately invoked functions。前两个示例都使用了立即调用的函数。我相信样式(function(){}());
比+function(){}();
更受欢迎。周围的()
和+
都会导致javascript解析器期望函数表达式而不是函数声明,这允许尾随{{} 1}}调用该函数。除了可读性稍差()
之外,还可能会改变函数的返回值。
我想你想要一些变化(copied from link):
+
答案 1 :(得分:1)
虽然所有这些都是有效的JS,但你做出的假设让我相信你可能不了解JS是如何工作的。前两个例子根本不是通常意义上的构造函数......它们是一种模块模式,但不是偶数。你可以把它压缩到
var Honda = {};
Honda.start = function() { console.log("Honda just started"); }
忘了自动执行功能。上面显示的内容类似于您在其他语言中作为static
函数的想法:
public class Honda {
public static void start() { Console.WriteLine("Honda Just Started"); }
}
如果您需要实例函数,则需要附加到原型或构造函数中的this
关键字:
原型:
var Honda = function() {}
Honda.prototype.start = function() { console.log("Honda just started"); }
此:
var Honda = function() {
this.start = function(){
console.log("Honda just started");
}
}
你的最后一个例子,丰田表示你对功能构造函数的工作方式存在根本性的误解。您的对象已被丢弃,作为回报,您将获得一些可能已写入的对象文字:
var Toyota = {
start: function(){
console.log("Toyota just started");
}
}
你(可能)想要的是我在上面的本田例子中解释的“这种”模式:
var Toyota = function() {
this.start = function() {
console.log("Toyota just started");
}
}
最后,在编写“命名空间”函数库时,模块模式可能是您最好的朋友。这使您可以维护私有状态而无需正式的构造函数/原型等:
var MyCompany = {};
//car module
(function(ns){
var module,
_isStarted;
function start() { console.log('start'); _isStarted = true; }
function stop() { console.log('stop'); _isStarted = false; }
function isStarted() { return _isStarted; }
module = {
start: start,
stop: stop,
isStarted: isStarted
}
ns.CarModule = module;
}(MyCompany));
//use:
MyCompany.CarModule.start();
if(MyCompany.CarModule.isStarted()) { MyCompany.CarModule.stop(); }