我最近开始保持别人的JavaScript代码,我正在修复错误,添加功能,也试图更新代码并使其更加一致。
以前的开发人员使用了两种方式来宣布功能,我无法解决是否有原因。
兩種方式是:
var functionOne = function() {
// Some code
};
function functionTwo() {
// Some code
}
使用这两种不同的方法的原因是什么?每个方法的优点和缺点是什么?可以用一种方法做些什么,不能用另一种方法做些什么?
一个重要原因是添加一个和只有一个变量作为你的名称空间的“根”。
var MyNamespace = {}
MyNamespace.foo= function() {
}
或
var MyNamespace = {
foo: function() {
},
...
}
有很多技术来搜索名称,它变得更加重要,有许多可用的JavaScript模块。
此分類上一篇: 如何在JavaScript中宣告名稱空間?
兩個函數之間的另一個區別是函數One 可以用作可持有多個函數的變量,而函數Two 持有某些代碼區塊,在呼叫時全部執行。
var functionOne = (function() {
return {
sayHello: function(){
console.log('say hello')
},
redirectPage:function(_url){
window.location.href = _url;
}
}
})();
您有一个选项,该函数将被称为. e.g 函数One.sayHello 或函数One. redirectPage. 如果您呼叫函数Two 那么整个代码块将被执行。
函数One = 函数() {} 定义在运行时间,函数Two() {} 定义在部分时间。
// Run-Time function declaration
functionOne(); // Calling functionOne function here will give an Error
var functionOne = function () {
// Some code
};
// Parse-Time function declaration
functionTwo(); // Calling functionTwo function will not give an Error
function functionTwo() {
// Some code...
}
此分類上一篇: Run-time vs Parse-time javascript run-time vs parse-time
对格雷格的答案有更好的解释
functionTwo();
function functionTwo() {
}
為什麼沒有錯誤?我們總是被教導,表達從上到底(??)
因为:
函数声明和变量声明总是由JavaScript翻译器无视地移动到其内容范围的顶部。
这就是这样的代码:
functionOne(); --------------- var functionOne;
| is actually | functionOne();
var functionOne = function(){ | interpreted |-->
}; | like | functionOne = function(){
--------------- };
请注意,提交声明的部分未被提交;只有名称被提交。
但是,在函数声明的情况下,整个函数身体也将被包围:
functionTwo(); --------------- function functionTwo() {
| is actually | };
function functionTwo() { | interpreted |-->
} | like | functionTwo();
---------------