我真的不明白
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。我甚至知道指针是什么。
答案 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()
中存储的对象将被“读取”。