从内部函数访问外部函数变量

4
如何在函数B()中改变函数A()中变量x的值?
function A() {
    var x = 10; // Value to be changed
    function B() {
        var x = 20;
        // From here i want to change the value of x (i.e. x=10 to x=40)
    }
    B();
}

A();

1
很简单,只需将你的另一个变量命名为y - elclanrs
这是一个关于编程的面试问题,两个变量都应该命名为x。 - Coolenough
你能否在 B() 函数内部返回 40,然后在调用 B 函数时使用 x = B(); - jeremy
@Siu 为什么需要在没有实际改进的情况下编辑每篇帖子?请参阅何时应对代码进行编辑? - Nick stands with Ukraine
4个回答

10

在想要覆盖变量时,请不要使用var。使用var会创建一个新的变量,只局限于声明它的作用域内。这就是为什么外部的x没有发生变化。

function A() {
    var x = 10;
    function B() {
        x = 20; // change x from 10 to 20
    }

    B(); // x is now changed
}

哈哈,我认为那是显而易见的答案...我们被允许这样做吗? - jeremy

4
如果我理解您的问题,以下代码是一个解决方案:
function A() {
    var x = 10; // Value to be changed
    function B() {
        var x = 20;
        // From here i want to change the value of x (i.e. x=10 to x=40)
        changeX(40);
    }
    function changeX(y) {
        x = y;
    }
    B();
    alert(x);
}

A();

然而,还有更加优雅的方法,但这取决于您的应用程序。

2
也许:
function A() {
    var x = 10; // Value to be changed
    function B() {
        var x = 20;
        return x; // Return new value of x
    }
    x = B(); // Set x to result returned by B(), i.e. the new value
}

A();

1

var语句将创建新的本地变量。因此,在您的示例中:

function A() {
    var x = 10; // You can think of it as A.x
    function B() {
        var x = 20; // And this as A.B.x
    }
}

这两个变量属于不同的作用域,如果你想从内部作用域访问外部作用域的变量,只需直接访问它,无需重新声明。

你可能想查看“JavaScript语言规范”文档,该文档可在http://www.planetpdf.com/codecuts/pdfs/tutorial/jsspec.pdf上获取,以了解JavaScript中作用域、语句和其他基础知识的工作原理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接