我今天正在复习一些,当我遇到以下约定时:
TestParam(1);
function TestParam(p){
var p = p + 1;
alert(p); // alerts '2'
}
现在,很明显,开发人员并不打算在函数中删除 'p',而是可能意味着:
p = p + 1;
但代码仍然有效,即警报值是“2”。所以这让我开始思考。在以下情况下会发生什么:
var a = 1;
TestParam(a);
alert(a); // alerts "1"
function TestParam(p){
var p = p + 1;
alert(p); // alerts '2'
}
警报再次如我所料(如上述评论中所暗示)。所以我很好奇如果我使用一个对象会发生什么:
var a = { b: 1 };
TestParam(a);
alert(a.b); //alerts 1
function TestParam(p) {
var p = {b:p.b + 1};
alert(p.b); //alerts 2
}
因此,在这种情况下,JavaScript 已经“记住”了变量 a
,即使当它作为 p
传递给 TestParam 时,p
> 重新声明。
现在如果我在函数内完成以下操作,那么两个警报都将是“2”
p.b++;
//var p = {b:p.b + 1};
即它会修改原始对象的成员 b
。我明白了。让我感到困惑的是之前的场景!
我意识到这是一个假设性的问题,不太可能在现实世界中发挥多大用处,但它仍然让我很好奇,关于后台发生了什么,以及 JavaScript 究竟是如何界定和引用这些变量的.
有什么想法吗?
请您参考如下方法:
变量的作用域为 JavaScript 中的封闭函数。您可以根据需要多次声明它们。
对象不绑定(bind)到变量;许多变量可以引用同一个对象。 (这有时称为别名。)这就是您上一个示例中发生的情况。 JavaScript 根本没有“记住”变量 a
;相反,p
和 a
指的是同一个对象,因此当它通过 p
更改时,您可以通过 a 查看这些更改
。
下面是一个可能对您更有意义的示例。有时一个人有不止一种身份。
var Clark = new Person;
var Superman = Clark; // Maybe not everybody needs to know these two are
// the same person, but they are.
Clark.eyes = "brown";
alert(Superman.eyes); // should be brown, right?
了解您所使用的语言的规则具有巨大的“实际用途”。不理解这两条规则是许多困惑和错误的根源。