请忽略这可以在没有变量的情况下重写。这只是举一个简单的例子。
window.onload = function() {
var a = document.body, b = function() {console.log(1)};
a.onkeydown = b;
};
我知道会发生什么:它有效。但是怎么做呢?
如果b
是一个全局变量,解释器将存储对它的引用。在这个例子中,解释器是否存储了对局部变量的引用,只是为了在局部变量被销毁时用我假设的函数副本替换它?还是对局部变量的引用仍然存储在幕后的某个地方,然后被重新利用?
函数(和其他对象)总是通过引用传递。 b
不包含该函数,而是指向该函数。当你赋值a.onkeydown = b
时,你a.onkeydown
指向同一个函数对象。然后函数结束,因此局部b
变量被销毁,但它指向的函数仍然存在 - 只有当没有其他东西指向它时,垃圾收集器才会删除它。