JavaScript函数中变量的生命周期

时间:2015-09-09 14:22:32

标签: javascript

函数中的局部变量似乎在调用函数后仍然存在。总是这样吗?这是如何工作的?

    // example 1
    function Obj(str) {
        this.show = function () { return str; };
    }

    var o1= new Obj("jeff");
    var o2 = new Obj("eric");

    o1.show();  // => "jeff"  (unexpected?)
    o2.show();  // => "eric"

同样的事情发生在这里:

    // example 2
    function newObj(str) {
        return { show: function () { return str; } };
    }

    var o3 = newObj("jeff");
    var o4 = newObj("eric");

    o3.show();  // => "jeff"  (unexpected?)
    o4.show();  // => "eric"

但是在这种情况下呢?

    // example 3
    function rand() {
        var a = Math.random(0);
        return a;
    }

    for (var i = 0; i < 1000000; i++) rand();   // are there a million random numbers stored somewhere?

2 个答案:

答案 0 :(得分:0)

经过一些研究和试验,我认为它可能会这样:

(1)当函数结束时,函数中的局部变量和值将被销毁,除非它们是从函数外部引用的。例如:

    // example 4
    var a;
    function myFunc() {
        var b = 1;
        var c = [1, 2, 3];
        a = c;
    }

    myFunc();   // variable b=1 is gone
    a;          // => [1,2,3], this value still exists

(2)函数的定义以某种方式包括其范围&#34;这意味着它所定义的环境。因此,在原始问题的示例1和2中,为什么&#34; str&#34;构造函数完成后记住的并不是构造函数记住它们,而是因为&#34; str&#34;在每个节目功能的范围内都会被记住。

这是一个没有对象的例子,只是函数:

    // example 5
    function returnFunction() {
        var a = Math.random(0);
        return function () { return a; };
    }

    f1 = returnFunction();
    f2 = returnFunction();

    f1();  // => 0.79
    f2();  // => 0.21
    f1();  // => 0.79
    f2();  // => 0.21

任何澄清或链接都将不胜感激。

答案 1 :(得分:0)

案例1和案例2都是关于闭包的。变量存储在所谓的调用帧中(例如,范围链)。

如果您了解C / C ++,那么您可以阅读我的文章&#34; JS closures for C++ devs&#34;。

否则请查看Richard Cornford的文章。