Jam*_*man 1 javascript scope pass-by-reference
我今天正在审查一些,当时我遇到了以下约定:
TestParam(1);
function TestParam(p){
var p = p + 1;
alert(p); // alerts '2'
}
Run Code Online (Sandbox Code Playgroud)
现在,显然,开发人员并不意味着在函数中删除'p',而是意味着:
p = p + 1;
Run Code Online (Sandbox Code Playgroud)
但代码仍然有效,即提醒的值是"2".所以它让我思考.在以下场景中会发生什么:
var a = 1;
TestParam(a);
alert(a); // alerts "1"
function TestParam(p){
var p = p + 1;
alert(p); // alerts '2'
}
Run Code Online (Sandbox Code Playgroud)
警报再次被我怀疑(如上面的评论所暗示).所以我很好奇如果我使用了一个对象会发生什么:
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
}
Run Code Online (Sandbox Code Playgroud)
因此,在这种情况下,JavaScript已经"记住"该变量a,即使它被传递给TestParam p,p也会被重新声明.
现在,如果我在函数中完成了以下操作,则两个警报都将为"2"
p.b++;
//var p = {b:p.b + 1};
Run Code Online (Sandbox Code Playgroud)
即它会修改b原始对象的成员.我明白了 它的前一个场景令我感到困惑!
我意识到这是一个相当假设的问题,不太可能带来太多现实世界的用处,但它仍然让我很好奇,关于后台发生了什么,以及JavaScript究竟是如何确定和引用这些变量的.
有什么想法吗?
变量的范围限定为JavaScript中的封闭函数.您可以根据需要多次声明它们.
对象不依赖于变量; 许多变量可以引用同一个对象.(这有时称为别名.)这就是你上一个例子中发生的事情.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?
Run Code Online (Sandbox Code Playgroud)
了解您正在使用的语言规则具有巨大的"实际有用性".不理解这两个规则是很多混乱和错误的根源.