Javascript中函數(shù)分類&this指向的實例詳解
JS中定義函數(shù)的三種方式
通過實例來說明吧
<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>
運行上面例子,證明了函數(shù)也是對象??梢圆捎胣ew + 構造函數(shù)的方式創(chuàng)建實例,第三種方式執(zhí)行效率低。
函數(shù)的原型鏈
從結果可以看到Function原型對象的__proto__指向Object。
JS中函數(shù)的分類和調用方式
通過實例來說明吧
<script> //函數(shù)的分類和調用方式 //方式1 普通標準函數(shù),this 指向window function fn() { console.log('fn1'+ this); } fn(); //本質是window.fn(); 全局函數(shù)是window的成員 //方式2 對象的方法 this 指向調用者o var o = { sayHi: function () { console.log('fn2'+this); } } o.sayHi(); //方式3 構造函數(shù) this指向新創(chuàng)建的對象,這里指向star1 function Star(username){ this.username = username; } var star1 = new Star('ldh'); //方式4 綁定事件函數(shù) this 指向函數(shù)的調用者 btn var fn = function (){ console.log('btn 被點擊了'+ this); } btn.onclick = fn; //點擊了按鈕就可以調用函數(shù) //方式5 定時器函數(shù) 定時器實際是window成員 所以this 就是window setInterval(function(){},1000); //定時器按照設定的時間間隔去調用 //方式6 立即執(zhí)行函數(shù) this 是window 同方式一 (function(){console.log('function executed')})(); //不需要調用立即執(zhí)行 </script>
通過上面的例子,基本上歸納了筆者了解的函數(shù)使用方式。通過方式4和方式6的對比,
- 我們可以知道函數(shù)后面加了() 表示立即調用,沒加(),表示函數(shù)的指針,只是指明函數(shù)不調用函數(shù)。
- this 指向問題,牢記this指向調用者
改變this 指向的三個函數(shù)
this 指向是JS中很重要的問題,在上面的函數(shù)分類中,已經有了系統(tǒng)的分析。下面重點總結改變this 指向的三個函數(shù)
call
把父類實例改成子類實例 實現(xiàn)屬性繼承
<script> //call function function Father(username, age) { this.username = username; this.age = age; } function Son(username, age, gender) { Father.call(this, username, age);//實現(xiàn)繼承父類的屬性 this.gender = gender; } </script>
apply
apply 和call 不同點,參數(shù)是數(shù)組(偽數(shù)組)。在apply內部會把數(shù)組拆成元素
主要使用 借助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 的指向 不調用函數(shù)
用途改變綁定事件的this,案例
<body> <button>click me</button> <button>click me</button> <button>click me</button> <script> //bind function //案例:實現(xiàn)多個按鈕發(fā)送驗證碼后 3s 可以再次發(fā)送 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 后執(zhí)行 }.bind(this), 3000); } } </script> </body>
總結
到此這篇關于Javascript中函數(shù)分類&this指向的文章就介紹到這了,更多相關JS函數(shù)分類this指向內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
KnockoutJS 3.X API 第四章之表單submit、enable、disable綁定
Knockout是一個以數(shù)據模型(data model)為基礎的能夠幫助你創(chuàng)建富文本,響應顯示和編輯用戶界面的JavaScript類庫。這篇文章介紹了KnockoutJS 3.X API 第四章之表單submit、enable、disable綁定的相關知識,感興趣的朋友一起看看吧2016-10-10微信小程序使用wx.request請求服務器json數(shù)據并渲染到頁面操作示例
這篇文章主要介紹了微信小程序使用wx.request請求服務器json數(shù)據并渲染到頁面操作,結合實例形式分析了微信小程序使用wx.request發(fā)送網絡請求及返回結果渲染到wxml界面相關操作技巧,需要的朋友可以參考下2019-03-03javascript 動態(tài)創(chuàng)建表格
這篇文章主要介紹了javascript 動態(tài)創(chuàng)建表格,需要的朋友可以參考下2015-01-01淺析Javascript中“==”與“===”的區(qū)別
這篇文章主要介紹了淺析Javascript中“==”與“===”的區(qū)別,非常的全面,這里推薦給小伙伴們2014-12-12