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

Javascript This
JScript code

<SCRIPT>
    var ComUtil = {
        com:'www.baidu.com',
        getCom:function(){
            alert(this.com);
        }
    }
    
    
    com = 'www.sina.com';
    
    function ShowCom(){    
    var myGetCom = ComUtil.getCom; 
    myGetCom(); 
    }  
    ShowCom();// 最后结果是:www.sina.com

</SCRIPT>

//网上的说法:临时(局部)变量是属于window对象的——只不过外界不能直接引用,只对Javascript引擎可见
//所以最后alert是www.sina.com就可以解释了,但是按照遮掩逻辑,下面的例子又想不通了
//按照这种说法推断:下面程序alert的时候同样也会去找window.com,
//由于window没有com,但是在#A处定义了一个局部变量,更具上面的说法,则这个局部变量时属于window的
//所以window.com应该是www.google.com,但是实际上的结果是undefined

<SCRIPT>
    var ComUtil = {
        com:'www.baidu.com',
        getCom:function(){
            alert(this.com);
        }
    }
    
    function ShowCom(){       // 保存getCookie函数到一个局部变量,因为下面会经常用到 
    var com = "www.google.com"; // #A
    var myGetCom = ComUtil.getCom;
    myGetCom(); 
    }  
    ShowCom();// 最后结果是:undefined
    
</SCRIPT>


究竟原理是什么?请高手指教。。

------解决方案--------------------
不用想的那么复杂,更不要死扣什么定义,很好理解的
this只代的是函数的调用者,或者说调用时函数所属的对象


com = 'www.sina.com'; 
function ShowCom(){
var myGetCom = ComUtil.getCom; //不要被这儿误导,直接把函数体代进来进行了,与其原对象无关
myGetCom(); //此处调用函数,在全局调用的(this所在函数不是任何对象的方法),调用时this指代window
}
ShowCom();// this指代window,返回的结果是window.com


function ShowCom(){ //
var com = "www.google.com"; // #A
var myGetCom = ComUtil.getCom;//这个com仅仅是函数ShowCom的内部成员,不具有全局性,所以不是window的成员
myGetCom(); 
}
ShowCom();// 最后结果是:undefined;理所当然的,上面已经说了this指代window,window没有定义com成员



------解决方案--------------------
<SCRIPT>
var ComUtil = {
com:'www.baidu.com',
getCom:function(){
alert(this.com);
}
}


com = 'www.sina.com';

function ShowCom(){
var myGetCom = ComUtil.getCom; 
myGetCom(); 
}
ShowCom();// 最后结果是:www.sina.com

</SCRIPT>
因为函数的作用域是全局的。
所以this 是指向window。
因此this.com 指向的就是全局变量com ="www.sina.com"
第2段代码解释也是一样!
因为全局作用域下没有com变量
所以undefined...
------解决方案--------------------
你直接alert一下this,看是什么类型的不就知道为什么了么。
------解决方案--------------------
你#A那那个com 如果没有var 那他才属于window
有var 那他就是ShowCom的局部变量
------解决方案--------------------

var myGetCom = ComUtil.getCom; 
myGetCom(); 
=
function(){
alert(this.com);
}
把上面的代码拷到showCom方法里面去执行你就发现问题在哪了