我最近开始维护其他人的JavaScript代码.我正在修复错误,添加功能,并尝试整理代码并使其更加一致.
以前的开发人员使用两种声明函数的方法,如果背后有原因,我就无法解决.
这两种方式是:
var functionOne = function() {
// Some code
};
Run Code Online (Sandbox Code Playgroud)
function functionTwo() {
// Some code
}
Run Code Online (Sandbox Code Playgroud)
使用这两种不同方法的原因是什么?每种方法的优缺点是什么?有一种方法可以通过一种方法完成,而另一种方法无法完成吗?
我正在阅读一些关于闭包的帖子,到处都看到了这个,但是没有明确的解释它是如何工作的 - 每次我被告知要使用它......:
// Create a new anonymous function, to use as a wrapper
(function(){
// The variable that would, normally, be global
var msg = "Thanks for visiting!";
// Binding a new function to a global object
window.onunload = function(){
// Which uses the 'hidden' variable
alert( msg );
};
// Close off the anonymous function and execute it
})();
Run Code Online (Sandbox Code Playgroud)
好的,我看到我们将创建新的匿名函数,然后执行它.所以在那之后这个简单的代码应该工作(并且确实如此):
(function (msg){alert(msg)})('SO');
Run Code Online (Sandbox Code Playgroud)
我的问题是这里发生了什么样的魔术?当我写作时我想:
(function (msg){alert(msg)})
Run Code Online (Sandbox Code Playgroud)
然后会创建一个新的未命名函数,如函数""(msg)...
但那么为什么这不起作用?
(function (msg){alert(msg)});
('SO');
Run Code Online (Sandbox Code Playgroud)
为什么它需要在同一行?
你能指点一些帖子或给我解释一下吗?
如何在客户端构建复杂的单页JS Web应用程序?具体来说,我很好奇如何根据模型对象,UI组件,任何控制器和处理服务器持久性的对象来干净地构建应用程序.
MVC起初似乎很合适.但是,如果UI组件嵌套在不同的深度(每个组件都有自己的方式对模型数据进行操作/对模型数据作出反应,并且每个生成事件本身可能会或可能不会直接处理),看起来MVC似乎不能干净利用.(但如果情况并非如此,请纠正我.)
-
(这个问题产生了两个使用ajax的建议,除了最简单的单页应用程序之外,其他任何东西显然都需要.)
javascript architecture design-patterns web-applications singlepage
看一下在线源代码,我在几个源文件的顶部看到了这个.
var FOO = FOO || {};
FOO.Bar = …;
Run Code Online (Sandbox Code Playgroud)
但我不知道是什么|| {}.
我知道{}是等于new Object(),我认为这||是为了"如果它已经存在使用其值,否则使用新对象.
为什么我会在源文件的顶部看到这个?
我正在维护一些遗留代码,我注意到使用了以下用于定义对象的模式:
var MyObject = {};
(function (root) {
root.myFunction = function (foo) {
//do something
};
})(MyObject);
Run Code Online (Sandbox Code Playgroud)
这有什么用途吗?它只相当于做以下事情吗?
var MyObject = {
myFunction : function (foo) {
//do something
};
};
Run Code Online (Sandbox Code Playgroud)
我不打算采用神圣的方式将整个代码库重构为我的喜好,但我真的很想了解定义对象的迂回方式背后的原因.
谢谢!
假设我有一个这样的命名空间:
var myNamespace = {
foo: function() {
},
bar: function() {
}
};
Run Code Online (Sandbox Code Playgroud)
将此代码拆分为定义foo和bar单独的文件的最佳方法是什么?
我并不担心加载时间 - 我会在部署之前将其连接回一个文件.
我创建了一个javascript类如下:
var MyClass = (function() {
function myprivate(param) {
console.log(param);
}
return {
MyPublic : function(param) {
myprivate(param);
}
};
})();
MyClass.MyPublic("hello");
Run Code Online (Sandbox Code Playgroud)
上面的代码是有效的,但我的问题是,如果我想将命名空间引入该类.
基本上我希望能够像这样调用类:
Namespace.MyClass.MyPublic("Hello World");
Run Code Online (Sandbox Code Playgroud)
如果我添加了Namespace.MyClass,它将抛出错误"语法错误".我确实尝试添加"window.Namespace = {}",但它也不起作用.
谢谢.. :)
我在JavaScript中看到了这两种基本的命名空间方式.
使用对象:
var Namespace = { };
Namespace.Class1 = function() { ... };
使用功能:
function Namespace() { };
Namespace.Class1 = function() { ... };
他们有什么不同?谢谢.
我一直在写很多javascript函数和事件监听器,我想将它们移动到它们自己的命名空间,隔离的地方,当我连接并用我的其他javascript文件缩小它时不会发生冲突.
我还是javascript的新手,所以这个答案可能有简单的解决方案.我开始创建一个javascript对象:
var MySpecialStuff = {
init: function(){
//do everything here
}
};
Run Code Online (Sandbox Code Playgroud)
然后在我的html中,在我想要使用它的页面上,我可以初始化这段代码:
<script>
MySpecialStuff.init();
</script>
Run Code Online (Sandbox Code Playgroud)
但随后该init方法开始增长,我需要开始将代码分解为更小的块,但我仍然坚持语法以及如何设置私有方法/变量并从init方法和其他私有方法中调用它们.我怎样才能做到这一点?
我是朝着正确的方向前进的吗?我/我应该采取哪些其他方式来做这类事情?
我总是学会在JavaScript中定义一个函数,如下所示:
function myFunction(arg1, arg2) { ... }
Run Code Online (Sandbox Code Playgroud)
但是,我刚刚阅读了谷歌的Javascript指南,它提到我应该定义这样的方法:
Foo.prototype.bar = function() { ... };
Run Code Online (Sandbox Code Playgroud)
问题:示例中的"Foo"是Object,还是名称空间?为什么Google示例不是以下代码(不起作用):
prototype.bar = function() { ... };
Run Code Online (Sandbox Code Playgroud)
更新:如果它有助于了解,我的所有JavaScript都将由用户浏览器调用我的Web应用程序.
javascript ×10
namespaces ×2
architecture ×1
function ×1
idioms ×1
iife ×1
or-operator ×1
singlepage ×1
syntax ×1