<html>
<head>
<script type='text/javascript'>
var process = function (test) {
var i = test;
this.echo = function () { console.log(i); };
};
var test = 'hai';
var hai = new process(test);
hai.echo();
test = 'sorry';
hai.echo();
</script>
</head>
<body style='height:1000px;width:100%'>
</body>
在执行上面的测试脚本时,我得到'对不起'两次,我希望是'hai'然后'hai'。
当我将第5行更改为[随机尝试]
时var i = (function () {return test;})();
我得到了'hai'&amp; '海'
它如何在案例2&amp;为什么不是在案例1?
AFAI,javascript会进行变量提升,因为 test 将在范围的开头初始化为 undefined ,并且会在分配给它时重新分配值。但这里没有帮助我。
答案 0 :(得分:3)
您通过传递值来混淆通过引用传递。 JavaScript only允许后者(尽管你可能会读到elswhere)。
在这种情况下,您将值"hai"
传递给process
构造函数。然后,该值在内部范围内存储到i
变量。在此之后更改test
的值不会更改i
的值。
出于同样的原因,您的测试用例都没有达到预期效果。
答案 1 :(得分:2)
您引用的代码的行为与您所描述的不同。但是无论如何试着回答这个问题,这里的代码有一些内联解释:
var process = function (test) {
var i = test;
// Here you're creating a "closure" over the context of
// this specific call to this function. So the `i` local
// variable lives on, even after this function call
// terminates.
this.echo = function () { console.log(i); };
};
// This `test` variable is *completely and totally* unrelated to the
// `test` argument to your function above. They do not interact in
// any way.
var test = 'hai';
// Here, yu're passing the *value* of the `test` variable ("hai")
// into the function. The function has no reference to the `test`
// variable at all (er, not a relevant way; details below). From
// the function's point of view, it's *exactly* like
// `var hai = new process("hai");`
var hai = new process(test);
// This will show "hai"
hai.echo();
// This will also show "hai", because again, the `i` in the `echo`
// function is the local variable in the call to `new process` above;
// it is in no way whatsoever related to the `test` variable here.
test = 'sorry';
hai.echo();
更多内容(在我的博客中):Closures are not complicated
有关process
函数如何对test
变量没有相关引用的说明的详细信息:从技术上讲,您指定的函数to process
确实引用了test
变量,因为它是对定义test
变量的范围的闭包。但它不是使用,因为它有自己的test
参数,并且符号阴影(覆盖)来自包含范围的那个。这与将test
传递到 {em} process
函数的调用无关,这就是为什么它无关紧要。
答案 2 :(得分:0)
它将显示2次hai。使用此脚本无法显示两次抱歉,因为[{1}}的区域范围内的存储变量i
和function echo
仅设置为i