鉴于此代码:
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 - 我如何访问“顶级”?
谢谢!
答案 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
会使它们成为同一对象(分配函数)的一部分。