【轉】JavaScript裏的this指針

 用天然語言的角度理解JavaScript中的this關鍵字

<script type="text/javascript">
    function ftn03(){
        var ftn04 = function(){//在javascript語言裏任何匿名函數都是屬於window對象
            console.log(this);// window , "函數裏的this指向window"
        };
        ftn04();
    }
    ftn03();
/*其實在javascript語言裏任何匿名函數都是屬於window對象,它們也都是在全局做用域構造時候完成定義和賦值,可是匿名函數是沒有名字的函數變量,可是在定義匿名函數時候它會返回本身的內存地址,若是此時有個變量接收了這個內存地址,那麼匿名函數就能在程序裏被使用了,由於匿名函數也是在全局執行環境構造時候定義和賦值,因此匿名函數的this指向也是window對象,因此上面代碼執行時候ftn04的this也是指向window,由於javascript變量名稱無論在那個做用域有效,堆區的存儲的函數都是在全局執行環境時候就被固定下來了,變量的名字只是一個指代而已。*/
</script>

情形一:傳入的參數是函數的別名,那麼函數的this就是指向windowjavascript

情形二:傳入的參數是被new過的構造函數,那麼this就是指向實例化的對象自己;html

情形三:若是咱們想把被傳入的函數對象裏this的指針指向外部字面量定義的對象,那麼咱們就是用apply和calljava

咱們能夠經過代碼看出個人結論,代碼以下:app

<script type="text/javascript">
var name = "I am window";
var obj = {
    name:"sharpxiajun",
    job:"Software",
    ftn01:function(obj){
        obj.show();
    },
    ftn02:function(ftn){
        ftn();
    },
    ftn03:function(ftn){
        ftn.call(this);//Call和apply是將this指針指向方法的第一個參數,ftn 對象代替 this 對象(this 繼承 ftn
    }
};
function Person(name){
    this.name = name;
    this.show = function(){
        console.log("姓名:" + this.name);
        console.log(this);
    }
}
var p = new Person("Person");
obj.ftn01(p);
obj.ftn02(function(){
   console.log(this.name);
   console.log(this);
});
obj.ftn03(function(){
    console.log(this.name);
    console.log(this);
});
</script>

結果以下:函數

 

最後再總結一下:this

this都是指向實例化對象,若是在javascript語言裏沒有經過new(包括對象字面量定義)、call和apply改變函數的this指針,函數的this指針都是指向windowspa

 

引用:<http://www.cnblogs.com/sharpxiajun/p/4148932.html>指針

相關文章
相關標籤/搜索