函数中的局部变量似乎在调用函数后仍然存在。总是这样吗?这是如何工作的?
// 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?
答案 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的文章。