如何在创建具有相同名称的局部变量之前保留父函数的变量值?

Sep*_*ram 2 javascript

我在函数中有一个本地表变量,并且一个子函数应该具有一个具有相同名称的变量,同时仍然能够访问父变量.这应该是显而易见的,但不幸的是,如果我在任何地方定义一个具有相同名称的局部变量,JavaScript不允许我访问父变量:

var p = {alpha : 'beta'};

console.debug (p);
// [08:16:21.896] ({alpha:"beta"})
// Okay.

(function() {
    console.debug (p);
    // [08:16:21.896] ({alpha:"beta"})
    // Right! JavaScript, you're so awesome!
})();

// One moment though, I think I still need the parent's table...
(function() {
    var p = { 'p': p };
    console.debug (p);
    // [08:16:21.896] ({p:(void 0)})
    // Wait, what?
})();

// Okay, maybe giving it the same name in the same statement confuses you?
(function() {
    var parent_p = p;
    var p = {};
    console.debug (parent_p);
    // [08:16:21.897] undefined
})();
// Give me back my variable! http://v.gd/jsWhyDoYouDoThis
Run Code Online (Sandbox Code Playgroud)

那里发生了什么?有什么方法可以解决这个问题吗?

acd*_*ior 5

尽管JavaScript看起来像C,Java等,但它们具有块级范围.JavaScript具有功能级范围.

因此在JavaScript中,if语句不会创建新块.只有功能.最重要的是,variable和function声明被"悬挂"(无形地移动)到块的顶部.这就是你问题的原因.

定义变量时:

function foo() {
    bar();
    var x = 1;
}
Run Code Online (Sandbox Code Playgroud)

实际上解释如下:

function foo() {
    var x;
    bar();
    x = 1;
}
Run Code Online (Sandbox Code Playgroud)

所以,如果你读了varible xbar(),即使是在较高的范围(外部定义foo()),它读取foo()x,这是undefinedbar()被执行.

仔细看看你的代码,试着理解实践中发生的事情:

var p = {alpha : 'beta'};
...    
(function() {
    // var p = { 'p': p }; actually is:
    var p;
    p = { 'p': p }; // thus p inside is `undefined`
    console.debug (p);
})();

(function() {
    // var parent_p = p; var p = {};  actually is:
    var parent_p, p;
    parent_p = p; // that's why parent_p becomes undefined here
    p = {};
    console.debug (parent_p);
})();
Run Code Online (Sandbox Code Playgroud)