日期:2014-05-16  浏览次数:20447 次

关于闭包的疑惑
(function() {
var obj = {};
var z = 'zhangsan';
obj.showName = function() {
alert(this);
};
window.ar = obj.showName;
})();
ar();
................1
var obj = {};
var z = 'zhangsan';
obj.showName = function() {
alert(this);
};
obj.showName();
..................2
为什么1得到的是window 2得到的是object
1为什么不是object呢,应该是obj啊,obj是调用者

------解决方案--------------------
1,ar(); 可以改写与  window.ar(); 
------解决方案--------------------

(function() {
        var obj = {};
        var z = 'zhangsan';
        obj.showName = function() {
            alert(this);
        };
        window.ar = obj;
})();
ar.showName();

obj 被释放了  showName没有了父级  被指向了window
改了下 你的例子  这个指向的是object 了

------解决方案--------------------
事实就是如此,函数中的this由调用者决定
作为obj的方法调用this指向obj,直接调用(相当于作为window的方法调用)则this指向window,能够理解吧?
------解决方案--------------------
window.ar = obj.showName;
这句话的意思是将 obj.showName;这个函数复制一份到window.ar上面,
------解决方案--------------------
对的,你把 obj的方法扔给了了window 所以。。。
------解决方案--------------------
在代码1中:
window.ar = obj.showName;这一句使得window.ar和obj.showName最后都指向同一个函数==
==>function() { alert(this);}。
而函数中的this是啥完全取决于函数真正执行时的那条语句:


window.ar()//这是函数作为window的属性调用,this就是window
obj.showName()//这是函数作为obj的属性调用,this就是obj