——《JavaScript高级程序设计》第3版 P178
就是作用域链的问题:(构造函数中定义的方法能访问它定义的属性,同理)
var num = 100;
function father(){
var num = 1;
return (function(){
console.log(num);
})()
}
var son = father(); // 1
上面不难理解,return的匿名函数立马自调用,变量num肯定是上级作用域的num = 1.
var num = 100;
function father(){
var num = 1;
return function(){
console.log(num);
}
}
var son = father();
son(); // 1
可能造成的误解:father(),调用完后被垃圾回收机制把变量啥的清空了。实际上,只要还有下级函数在用father的变量,就不会被回收,这并不会造成内存泄漏,但会占用过多的内存。
容易造成内存泄漏的情况:js对象与dom对象之间,循环引用(IE9之前)
function handler(){
var ele = document.getElementById('someId');
ele.onclick = function(){
console.log(ele.id);
}
}
HTML元素无法被销毁,一直被引用。
修改:
function handler(){
var ele = document.getElementById('someId');
var id = ele.id
ele.onclick = function(){
console.log(id);
}
ele = null;
}