JavaScript var可见性

时间:2011-04-05 16:37:20

标签: javascript oop function visibility core

鉴于此代码:

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”函数中使用不同的变量名,我将能够在函数中“看到”变量“v”,值为“1”。所以我有点隐藏了原来的那个,但仍然留下问题#3 - 我如何访问“顶级”?

谢谢!

3 个答案:

答案 0 :(得分:2)

You can't delete a variable like that

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

答案 1 :(得分:1)

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

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 :(得分:0)

将其更改为:

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

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

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

http://jsfiddle.net/hHvUq/