我最近开始保持别人的JavaScript代码,我正在修复错误,添加功能,也试图更新代码并使其更加一致。
以前的开发人员使用了两种方式来宣布功能,我无法解决是否有原因。
兩種方式是:
var functionOne = function() {
// Some code
};
function functionTwo() {
// Some code
}
使用这两种不同的方法的原因是什么?每个方法的优点和缺点是什么?可以用一种方法做些什么,不能用另一种方法做些什么?
谈到全球背景,这两种说法和函数声明最终将为全球对象创造一个不可分割的财产,但两者的价值可以被夸张。
两种方式之间的微妙区别在于,当变量定位过程运行(在实际代码执行之前)时,与 var 所宣布的所有标识符将以未定义的标识符开始,并且由 FunctionDeclaration 所使用的标识符将从那时起可用,例如:
alert(typeof foo); // 'function', it's already available
alert(typeof bar); // 'undefined'
function foo () {}
var bar = function () {};
alert(typeof bar); // 'function'
function test () {}
test = null;
你的两个例子之间的另一个显而易见的区别是,第一个函数没有名字,而第二个函数有它,这在解体时可能非常有用(即检查一个呼叫板)。
此外,未透露的任务在严格模式下在 ECMAScript 5 上投下参考错误。
必须读一读:
名称 函数表达 解密
一个函数声明和一个函数表达,在一个变量行为被定义后,相同。
基本上,所有函数声明和变量声明都被插入到声明发生函数的顶部(这就是为什么我们说JavaScript具有函数范围)。
当一个函数声明被拍摄时,函数体“跟随”,因此当函数体被评估时,变量将立即与函数对象联系起来。当一个变量声明被拍摄时,启动不会跟随,而是“左后面”。变量在函数体的开始时被启动到未定义,并将在其原始位置分配一个值。
一些例子......
var foo = 1;
function bar() {
if (!foo) {
var foo = 10 }
return foo; }
bar() // 10
function f() {
return a;
function a() {return 1};
var a = 4;
function a() {return 2}}
f()() // 2
function f() {
return a;
var a = 4;
function a() {return 1};
function a() {return 2}}
f()() // 2
函数声明优先于变量声明,最后的函数声明“粘贴”。
function f() {
var a = 4;
function a() {return 1};
function a() {return 2};
return a; }
f() // 4
在此例子中, a 与第二个函数声明的评估结果的函数对象开始,然后分配为 4.
var a = 1;
function b() {
a = 10;
return;
function a() {}}
b();
a // 1
a = 10
output : 10
(1 + 3)
output = 4
声明/声明:不返回值的东西 示例:
if (1 > 2) {
// do something.
}
此分類上一篇
同样,我们有函数声明/声明 vs 函数表达 请举一个例子:
// test.js
var a = 10;
// function expression
var fun_expression = function() {
console.log("Running function Expression");
}
// funciton expression
function fun_declaration() {
console.log("Running function Statement");
}
重要:在JavaScript引擎运行上面的JS文件时会发生什么。
现在,假设我们更新JS到。
// test.js
console.log(a) //output: udefined (No error)
console.log(fun_expression) // output: undefined (No error)
console.log(fun_expression()) // output: Error. As we trying to invoke undefined.
console.log(fun_declaration()) // output: running function statement (As fun_declaration is already hoisted in the memory).
var a = 10;
// function expression
var fun_expression = function() {
console.log('Running function expression')
}
// function declaration
function fun_declaration() {
console.log('running function declaration')
}
console.log(a) // output: 10
console.log(fun_expression()) //output: Running function expression
console.log(fun_declaration()) //output: running function declaration
在评论中提到的结果,应该有助于理解函数表达与函数声明/声明之间的区别。
二是定义函数的不同方式,区别在于浏览器如何解释并将其加载到执行背景中。
第一個案例是函數表達,只有當翻譯者達到這個代碼線時才會充電,因此,如果你這樣做,你會發現函數一不是函數的錯誤。
functionOne();
var functionOne = function() {
// Some code
};
原因在于,在第一行中,没有值被分配到函数One,因此它是不定义的,我们试图称之为函数,因此我们得到一个错误。
在第二行中,我们将匿名函数的参考归分为函数One。
第二个案例是功能声明,在任何代码执行之前加载,所以如果你喜欢下一个,你不会得到任何错误,因为声明加载,在代码执行之前。
functionOne();
function functionOne() {
// Some code
}