Javascript中函數分類&this指向的實例詳解
JS中定義函數的三種方式
通過實例來說明吧
<script> //method1 function fn() { console.log('fn created '); } //method2 var fn2 = function () { console.log('fn2 created'); } //method3 var fn3 = new Function('test', 'console.log(test);'); fn3('fn3 test'); console.dir(fn3); console.log(fn3 instanceof Object); </script>
運行上面例子,證明瞭函數也是對象。可以采用new + 構造函數的方式創建實例,第三種方式執行效率低。
函數的原型鏈
從結果可以看到Function原型對象的__proto__指向Object。
JS中函數的分類和調用方式
通過實例來說明吧
<script> //函數的分類和調用方式 //方式1 普通標準函數,this 指向window function fn() { console.log('fn1'+ this); } fn(); //本質是window.fn(); 全局函數是window的成員 //方式2 對象的方法 this 指向調用者o var o = { sayHi: function () { console.log('fn2'+this); } } o.sayHi(); //方式3 構造函數 this指向新創建的對象,這裡指向star1 function Star(username){ this.username = username; } var star1 = new Star('ldh'); //方式4 綁定事件函數 this 指向函數的調用者 btn var fn = function (){ console.log('btn 被點擊瞭'+ this); } btn.onclick = fn; //點擊瞭按鈕就可以調用函數 //方式5 定時器函數 定時器實際是window成員 所以this 就是window setInterval(function(){},1000); //定時器按照設定的時間間隔去調用 //方式6 立即執行函數 this 是window 同方式一 (function(){console.log('function executed')})(); //不需要調用立即執行 </script>
通過上面的例子,基本上歸納瞭筆者瞭解的函數使用方式。通過方式4和方式6的對比,
- 我們可以知道函數後面加瞭() 表示立即調用,沒加(),表示函數的指針,隻是指明函數不調用函數。
- this 指向問題,牢記this指向調用者
改變this 指向的三個函數
this 指向是JS中很重要的問題,在上面的函數分類中,已經有瞭系統的分析。下面重點總結改變this 指向的三個函數
call
把父類實例改成子類實例 實現屬性繼承
<script> //call function function Father(username, age) { this.username = username; this.age = age; } function Son(username, age, gender) { Father.call(this, username, age);//實現繼承父類的屬性 this.gender = gender; } </script>
apply
apply 和call 不同點,參數是數組(偽數組)。在apply內部會把數組拆成元素
主要使用 借助Math對象,Math.max.apply(Math, [4324, 45, 342, 23])
<script> //apply function var o = { username: 'testuser' }; function fn(arr) { console.log(arr); for (let i = 0; i < arr.length; i++) { console.log(arr[i]); } console.log(this); } fn.apply(o, [23, 43]); console.log(Math.max(43, 45, 243, 342)); console.log(Math.max.apply(Math, [4324, 45, 342, 23])); </script>
bind
隻改變this 的指向 不調用函數
用途改變綁定事件的this,案例
<body> <button>click me</button> <button>click me</button> <button>click me</button> <script> //bind function //案例:實現多個按鈕發送驗證碼後 3s 可以再次發送 var btns = document.querySelectorAll('button'); for (let i = 0; i < btns.length; i++) { btns[i].onclick = function () { this.disabled = true; setTimeout(function () { this.disabled = false;//改變this 指向btn ,3000ms 後執行 }.bind(this), 3000); } } </script> </body>
總結
到此這篇關於Javascript中函數分類&this指向的文章就介紹到這瞭,更多相關JS函數分類this指向內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- JS中call(),apply(),bind()函數的區別與用法詳解
- JavaScript函數this指向問題詳解
- 一文搞懂JavaScript中的this綁定規則
- Vue自定義指令中無法獲取this的問題及解決
- javascript實現點擊按鈕變色