我知道我可以将它作为参数传递,但为了进一步理解JS,有这样的事情:
function logIt() {
console.log(x)
}
[0,1,2].forEach(x => logIt())
// x is not defined
答案 0 :(得分:2)
其实没有。函数尝试查找范围内的变量以及声明它的上述范围。在您的情况下,logIt
在全局范围内声明,并尝试在那里找到x
,但您的x
在函数范围中定义,并传递给forEach
。换句话说,logIt
不会在x => logIt()
范围内查找其变量。
// Global scope, Look here, this is the scope where `logIt` was declared
function logIt() {
// Look here, this is my scope
console.log(x)
}
[0,1,2].forEach(x => {
// Does not look here, it is not the scope where `logIt` was defined and not the global scope
logIt();
})
答案 1 :(得分:1)
范围访问权限与功能定义的范围有关,而不是使用的范围。由于x
在logIt()
定义的范围内不存在,因此除非通过参数传入,否则它在函数内部不可用。
答案 2 :(得分:1)
不是,不。函数无法在调用它的范围内伸出并访问变量。*这是一件好事™。 : - )
你可以定义一个logIt
和匿名forEach
回调都可以访问的变量,在回调中设置该变量的值,并在{中使用它{1}}:
logIt

......但在大多数情况下,这将是一件坏事。我们有函数参数是有原因的。 : - )
* (可以>在创建它的范围的执行上下文中访问变量[以及包含该上下文的上下文],但这是不同的。)