Javascript 如何访问JS中嵌套的内部函数中的外部函数变量

Javascript 如何访问JS中嵌套的内部函数中的外部函数变量,javascript,Javascript,我是JS新手,对下面的例子有疑问。请参阅内联注释 函数外部(){ var x=5; console.log(“外部”,x);//打印5 console.log(“--------------”; 函数内部(){ var x=6; console.log(“内部”,x);//打印6 console.log(“outer”,x);//打印6.如何打印5 console.log(“--------------”; 函数_inner(){ var x=7; console.log(“_-inner”,

我是JS新手,对下面的例子有疑问。请参阅内联注释

函数外部(){
var x=5;
console.log(“外部”,x);//打印5
console.log(“--------------”;
函数内部(){
var x=6;
console.log(“内部”,x);//打印6
console.log(“outer”,x);//打印6.如何打印5
console.log(“--------------”;
函数_inner(){
var x=7;
console.log(“_-inner”,x);//打印7
console.log(“内部”,x);//打印7.如何打印6
console.log(“outer”,x);//打印7.如何打印5
console.log(“--------------”;
}
_内();
}
内();
}

外部()可能对您有所帮助。将变量分配给嵌套函数,因为这样可以清楚地知道应该使用什么变量,但它们必须在某些方面(名称或通过命名空间)彼此不同:

在本例中,三个变量中只有两个被分配给函数(而不是外部x),因为否则您可以从外部函数外部评估外部.x并为其分配任何值:

function outer(){
   outer.x = 5;
   ...
}
// assign any value outside outer function
outer.x = 34;
但当定义局部变量时:

function outer(){
   var x = 23;
}

那么就没有机会从外部函数为这个局部变量(x)赋值。

Javascript默认情况下不像许多编程语言那样阻止作用域变量。这意味着,像您在上面声明的变量x是同一个变量

无论变量声明出现在何处,都会在执行任何代码之前进行处理

我建议不要在嵌套函数中使用相同的变量名。它变得难以阅读和调试。你真的需要嵌套函数吗

function outer() {
    var x = 5;
    console.log("outer",x); // Prints 5
    console.log("-----------");
    inner(x);
}
function inner(x1) {
    var x = 6;
    console.log("inner",x); // Prints 6
    console.log("outer",x1); // Prints 5
    console.log("-----------");
    _inner(x,x1);
}
function _inner(x1, x2) {
    var x = 7;
    console.log("_inner",x); // Prints 7
    console.log("inner",x1); // Prints 6. 
    console.log("outer",x2); // Prints 5.
    console.log("-----------");
}
outer();
或者您可以使用对象这样声明它

function outer() {
    var x = {
      outer: 5
    };
    console.log("outer",x,outer); // Prints 5
    console.log("-----------");
    function inner() {
        x.inner = 6;
        console.log("inner",x.outer); // Prints 6
        console.log("outer",x.inner); // Prints 6. How to print 5
        console.log("-----------");
        function _inner() {
            x._inner = 7;
            console.log("_inner",x._inner); // Prints 7
            console.log("inner",x.inner); // Prints 7. How to print 6
            console.log("outer",x.outer); // Prints 7. How to print 5
            console.log("-----------");
        }
        _inner();
    }
    inner();
}
outer();

当我们在方法中重用变量名时,只有块作用域可以工作。意味着范围将是工作。对于这些变量,大括号{…} 将定义范围

你可以尝试的是 定义全局变量

var x = 5;
    var innerx = 5;
    var _innerx = 5;
    function outer() {
    }
   

作为参数传递给具有不同名称的内部函数?如果局部变量的名称与更全局的变量的名称相同,则(实际全局范围的情况除外)无法访问外部变量。是否有意让所有三个变量的名称完全相同?只需将“内部”变量的名称更改为
y
,“_内部”变量的名称更改为
z
,您就可以得到预期的结果。@Lix。。。我故意把它保留为“x”。。。我知道如果我有不同的变量名或作为参数传递…该示例将非常好地工作。。。我只是想知道有没有像这个例子一样的方法。@Roy:没有一种机制可以完全满足你的需求。解决方案是使用不同名称的变量。在javascript中,您想要的是
outer.x=5,这是完全不可能的(至少在ES6之前)意味着创建prototype属性?不。您必须以这种方式使用prototype,如:outer.prototype.x。所有类型为outer的派生对象都可以访问此变量,因此它是一种类变量。写入outer.x也是可能的,并且所有对象都可以访问它,但不建议这样做,因为继承只在原型上正常工作,并且在访问对象方法中某处的x变量时,不必再次写入函数名(outer)。希望我写的不是那么复杂:)为变量使用不同的名称函数outer(){var x=5;函数inner(){var innerx=6;函数inner(){var\u innerx=7;}}}
var x = 5;
    var innerx = 5;
    var _innerx = 5;
    function outer() {
    }