<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就是指向window;javascript
情形二:傳入的參數是被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指針都是指向window的。spa