为什么setTimeout两次关闭我的变量?

时间:2011-03-09 22:17:24

标签: javascript

我真的不明白

var f = function() { alert('f') };
var g = function() { alert('g') };
setTimeout(f, 2000);
var h = function() { f() };
f = g;
h();

是的,我知道,这是它的方式,我必须忍受它,但我没有看到任何理由。启发我。

PS。在你回答之前检查一下这个主题,我正在以Python,Ruby和.NET为生,我读过Crockford。我甚至知道指针是什么。

2 个答案:

答案 0 :(得分:1)

  

我真的不明白

哪一位?

您的代码首先回应g

当你说:

var h = function() { f() };

您没有获取f的当前并记住它,您正在创建一个包含对变量 {{1}的引用的闭包在容器范围内(这里可能是全局范围)。

在该定义之后更改变量f的内容,之后运行的函数f看到的值将会改变。它与以下情况相同:

h

你的代码回复var a= 1; function b() { alert(a); } a= 2; b(); // 2 秒?

f

在这种情况下,您设置了超时,而setTimeout(f, 2000); 的值仍然是打印f的函数。您尚未引用变量f,仅传递其当前值。之后更改f的值不会更改先前传入的值;仍然是f - 打印功能。

(Value-versus-reference是大多数当前流行的编程语言模糊不清的东西,但至少在JavaScript中,有些值是Function对象的事实并没有什么特别之处。)

答案 1 :(得分:0)

1)setTimeout()将ptr作为第一个参数传递给Function个对象。

就像你期望的那样

function strlen(s) {
    var f = function() { alert(s.length); };
    return setTimeout(f, 1000);

var s1 = "xx";
strlen(s1);
s1 = "yyy";

提醒"xx"的长度,而不是"yyy"的长度。

2)var h = function() { f() };使用var f的关闭。调用f时,h()中存储的对象将被“读取”。