【问题标题】:JavaScript var visibilityJavaScript 变量可见性
【发布时间】:2011-07-30 03:25:26
【问题描述】:

鉴于此代码:

function MyClass() {
    var v = '1';
    this.hi = function() {
        console.log('Value of V is ' + v);
        var v = '2';
        console.log('Value of V is ' + v);
        delete(v);
        console.log('Value of V is ' + v);
    }
}

当我做类似的事情时:

z = new MyClass();
z.hi();

我得到的结果是:

Value of V is undefined 
Value of V is 2
Value of V is 2

我要解释的是为什么结果是这样的。

  • 为什么 V 是未定义的(我理解它的方式 - 它可能不正确 - 在 JS 中它都是定义时,而不是运行时,所以定义函数有它自己的变量“v ",但它还没有在第一行定义)。

  • 为什么不删除 V?保持相同的价值?

  • 如何从“一级”访问值为“1”的“v”?

  • 我知道如果我在“hi”函数中使用不同的变量名,我将能够在函数中“看到”值为“1”的变量“v”。所以我有点隐藏原来的那个,但这仍然留下了第 3 个问题——我如何访问“顶层”?

谢谢!

【问题讨论】:

  • delete 仅适用于对象属性。

标签: javascript oop function visibility core


【解决方案1】:

至于 why 未定义部分,您的代码编译为:

function MyClass() {
    var v = '1';
    this.hi = function() {
        var v;
        console.log('Value of V is ' + v); // undefined!
        v = '2';
        console.log('Value of V is ' + v);
        delete(v);
        console.log('Value of V is ' + v);
    }
}

如您所见,var 是在作用域的开头声明的。这就是 JS 的工作原理。通过 JSLint 运行它并亲自查看。

【讨论】:

    【解决方案2】:

    改成这样:

    function MyClass() {
        this.v = '1';
    ...
    

    并确保您始终将此功能与New 一起使用。

    this 指的是事物所属的对象。因此,创建 this.hi 会使范围内的某些内容与函数本身完全无关,但对所有成员使用 this 会使它们都成为同一个对象(函数被分配给该对象)的一部分。

    http://jsfiddle.net/hHvUq/

    【讨论】:

      【解决方案3】:

      You can't delete a variable like that.

      您无法从封闭范围访问v,因为内部范围中的v“隐藏”了它。重命名。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-06
        • 2017-06-13
        • 1970-01-01
        • 2015-10-20
        • 2014-09-20
        • 2021-09-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多