十分鐘徹底理解javascript 的 this指向,不懂請砸店
阿新 • • 發佈:2017-05-04
hub 改變 alert blog var rip def 徹底 文章
函數的this指向誰,和函數在哪裏被定義的,函數在哪裏被執行的沒有半毛錢關系,只遵守下面的規律:
在非嚴格模式中:
1、自執行函數裏面,this永遠指向window;
<script> var a = 1; var o = { a: 2, fn: (function(){ //自執行函數,在定義的時候就已經執行啦 console.log(‘自執行函數裏面是window‘,this.a); //自執行函數裏面的this指向的是windowreturn function() { // 但是這裏的this 指向的是誰調用的這個函數 console.log(‘但是還是要具體問題具體分析‘,this.a) } })() } o.fn(); </script>
結果請看
2、給元素的某一個行為綁定方法,當行為觸發所調用的函數裏面this指向的該dom 元素;
<script> vardd = document.getElementById(‘dd‘); function f1 () { console.log(this); } dd.onclick=f1; // 點擊的那個dom對象 </script>
但是我要是稍微改一下:
<script> var dd=document.getElementById(‘dd‘); function fn () { console.log(this); } dd.onclick=function(){ console.log(this); // dom 對象 fn(); // window ,這時候就看該函數是被誰調用的啦 } </script>
3、看看函數執行有咩有 . ,如果有則是前面的那個,如果沒有則是window
4、在構造函數裏面,this 指向的是當前的實例;
<script> function fn() { console.log(this); }; function ff () { this.name="杜俊成"; this.say=function(){ console.log(this); // this指向該構造函數的原型 fn() // window ,因為fn 函數的直接調用者是window, } } var a = new ff(); a.say(); </script>
5、使用call / apply 改變了this 的指向;(關於call 和 apply 想一勞永逸的搞明白嗎?請看我的一篇文章)
嚴格模式:
1、自執行函數裏面,this永遠指向undefined;
<script> var obj ={ fn:(function(){ // this => undefined console.log(this) return function(){ // this=> obk console.log(this); } })() } obj.fn; //obj.fn 的方法在聲明的時候就已經被執行了, window obj.fn(); //obj.fn的自執行方法返回的方法執行 obj </script>
2、看前面有咩有 . ,如果有則是前面的那個,如果沒有則是undefined
總結就是:嚴格模式和非嚴格模式的區別:當調用主體不明時,嚴格模式是undefined,非嚴格模式是window
<script> ‘use strict‘; function fn(){ alert(this); } /*非嚴格模式*/ fn.call()//this - window; fn.call(null)//this - window; fn.call(undefined);//this -undefined /*嚴格模式下,給call或apply第一個參數傳誰this就是誰,不傳就是undefined*/ fn.call() //this - undefined; fn.call(null) //this -null; fn.call(undefined) //this-undefined </script>
最後打一個小廣告,本人武大大三學生,熱愛前端開發,有半年的項目經驗和實習經驗,給國內外多家公司做過前端的外包工作;
求北京,上海,杭州靠譜公司的實習,求各位前端大佬們帶飛;
github地址:https://github.com/dujuncheng
十分鐘徹底理解javascript 的 this指向,不懂請砸店