JavaScript中标准函数的作用域是什么



我知道用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

最新更新