2011-04-05 47 views
2

鉴于此代码:的JavaScript变种的知名度

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 - 我如何访问“顶级”?

谢谢!

+0

'delete'只适用于对象属性。 – Jerry 2016-05-03 14:15:49

回答

0

它改成这样:

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

并确保你总是使用该功能New

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

http://jsfiddle.net/hHvUq/

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运行它并亲自查看。