我可以在函数中定义一个javascript变量(不是全局变量)并且该变量在其作用域之外可见吗?
我需要在函数中定义一个变量,这个变量必须在其原始范围和上面的一个范围内可见(它与全局变量不同) 这在javascript中是可能的吗 例如我可以在函数中定义一个javascript变量(不是全局变量)并且该变量在其作用域之外可见吗?,javascript,variables,scope,Javascript,Variables,Scope,我需要在函数中定义一个变量,这个变量必须在其原始范围和上面的一个范围内可见(它与全局变量不同) 这在javascript中是可能的吗 例如 function mainFunction () { function firstFunction() { var var1 = 10; secondFunction(); console.log(var2); // must be 20 (must be undefined one scope above f
function mainFunction () {
function firstFunction() {
var var1 = 10;
secondFunction();
console.log(var2); // must be 20 (must be undefined one scope above firstFunction())
console.log(var1); // must be 10 (of course)
}
function secondFunction() {
var var2 = 20;
console.log(var2); // must be 20 (of course)
console.log(var1); // must be undefined
}
firstFunction();
console.log(var2); // must be undefined
console.log(var1); // must be undefined
}
使用
相反secondFunction()
超出了firstFunction()
的范围,因此您的评论
// must be 20 (must be undefined outside firstFunction() scope)
这意味着
var2
永远无法访问secondFunction()
使用ES6您可以阻止这些函数的作用域。这将给出在特定块中定义的“全局”变量,并使在此范围内定义的函数可以访问该变量
{
let var1 = 10;
function one() {
//...
}
function two() {
//...
}
}
这使您能够简单有效地控制范围,尤其是在起重和功能方面
编辑到您的编辑:除非您将
var2
作为参数传递给函数,否则如果没有某种更高级别的作用域,就无法将其作用域限定为2个函数。也就是说,如果main函数没有作用域,firstFunction就不能访问var2(同样,除非参数化)。它的工作方式就像您在代码中对它进行了注释一样。函数作用域不会传播到全局作用域
为什么不在顶部声明变量呢
var var1, var2;
例如,一种可能是使用静态变量
function firstFunction() {
firstFunction.var1 = 10;
}
// you can access firstFunction.var1 outside the firstFunction()
…但这当然是一种噱头。在javascript中,私有变量可以通过闭包访问。闭包是一个可以访问父作用域的函数,即使在父函数关闭之后也是如此
function mainFunction () {
function firstFunction() {
var var1 = 10;
var var2 = secondFunction();
console.log(var2); // must be 20
console.log(var1); // must be 10 (of course)
}
function secondFunction() {
var var2 = 20;
console.log(var2); // must be 20 (of course)
return var2;
}
firstFunction();
// console.log(var2); // must be undefined
// console.log(var1); // must be undefined
}
mainFunction();
您的代码缺少
var
所以这些都是全局代码,但您的问题的答案是“否”。Pointy所说的在这里是准确的。所有(目前已有6或7个)答案都不正确和/或不适用于您的问题。谢谢。如果修正了变量声明。对不起。我的意思是:“必须在firstFunction()上定义一个作用域。”。谢谢,我修好了。对不起,我的坏。。。我试着做一个代码块注释,但我对这个还是有点陌生,你能解释一下吗?我是ES6新手,所以我很想知道哪里出了问题。OP特别要求不要将其纳入全球范围。附加到窗口
就可以做到这一点。
function mainFunction () {
function firstFunction() {
var var1 = 10;
var var2 = secondFunction();
console.log(var2); // must be 20
console.log(var1); // must be 10 (of course)
}
function secondFunction() {
var var2 = 20;
console.log(var2); // must be 20 (of course)
return var2;
}
firstFunction();
// console.log(var2); // must be undefined
// console.log(var1); // must be undefined
}
mainFunction();