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