我今天正在复习一些,当我遇到以下约定时:

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;相反,pa 指的是同一个对象,因此当它通过 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? 

了解您所使用的语言的规则具有巨大的“实际用途”。不理解这两条规则是许多困惑和错误的根源。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!