我知道用JavaScript声明函数有不同的方法。具体地说,我对";标准";声明函数的方法,假设我们有下一个函数:
function salute(name) {
let phrase = `Hello ${name}, nice to meet you`;
document.write(phrase + `<br/>`);
}
(我知道document.write()
不是一个好的实践,但我只是用它来测试代码(。
现在,可以为salute
分配另一个功能,例如:
salute = function(){
document.write(`This is a different function <br/>`);
}
原始的salute
函数是否像var变量/对象一样声明?我知道,如果声明为var,可以在同一范围内重新声明变量,例如:
var aVariable = 10;
var aVariable = 11;
但是,正如这里所解释的,let和const不起作用:var和let 之间的差异
继续使用原始代码,我意识到我可以使用var:重新声明salute
var salute = function(){
document.write(`This is a different function <br/>`);
}
但我不能用let或const做同样的事情。这使我得出结论;标准";声明函数的方法有一个隐含的var作用域。我说得对吗?
这在很大程度上取决于您所考虑的"标准";对此,我想说答案是肯定的和否定的。
在脚本的顶级环境中,函数的行为类似于变量声明(例如var
(。这意味着您甚至可以编写两次相同的函数声明,并且不会抛出任何错误。最后一个声明将覆盖前一个声明。
function test(){
console.log(1);
}
function test(){
console.log(2);
}
test(); //2
在函数定义中,行为基本相同:
(function nested(){
function test(){
console.log(1);
}
function test(){
console.log(2);
}
test(); //2
})()
请注意,这甚至可能是strict
代码:
(function nested(){
'use strict';
function test(){
console.log(1);
}
function test(){
console.log(2);
}
test(); //2
})()
然而,一旦我们开始使用块ANDstrict
代码。。。事情开始改变。。。
'use strict';
{
test();
function test(){
console.log(1);
}
function test(){
console.log(2);
} //SyntaxError
}
此外,与脚本顶层环境不同,模块的行为也类似于strict
模式下的块(就函数声明而言(。
function test(){
console.log(1);
}
function test(){
console.log(2);
}
test(); //SyntaxError
它仍然不完全是let
,因为函数仍然被挂起(let
变量在到达声明之前不会被初始化(,而且它作为const
变量肯定不是不可变的,因为你仍然可以覆盖函数。
'use strict';
{
test = function(){
console.log(2);
}
test(); //2
function test(){
console.log(1);
}
}
在JavaScript中,对象和函数也是变量。因此,基于此网站,功能可以被自动视为Global:https://www.w3schools.com/js/js_scope.asp