Javascript变量声明&范围

时间:2012-03-08 10:09:00

标签: javascript html

<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 ,并且会在分配给它时重新分配值。但这里没有帮助我。

3 个答案:

答案 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}}的区域范围内的存储变量ifunction echo仅设置为i