函式的定義的有三種方式:自定義函式、函式表示式(字面量)以及利用new function的方法。
1.1 自定義函式(命名函式)
functionfn(
)
1.2 函式表示式(匿名函式,字面量方式)
var
fun=
function()
1.3 利用new function(『引數1』,『引數2』,'函式體』)執行效率較低
var f =
newfunction
('a'
,'b'
,'console.log(a+b)'
);
為什麼說通過new的方式建立函式的執行效率較低呢?在呼叫new的過程中會發生一下四件事情:
(1)新生成乙個物件
(2)鏈結到原型
(3)繫結this
(4)返回新物件
對於物件來說,其實都是通過new產生的,無論是function fn()還是var fun = function () {},對於建立乙個物件來說,更推薦使用字面量的方式建立物件(無論是考慮效能還是可讀性)。因為你使用new object()的方式建立物件需要通過作用域立鏈一層一層的找到object,但是你使用字面量方式就沒這個問題。
1.4 函式的呼叫方式
(1)普通函式fn()或者fn.call()
(2)物件的方法,物件.方法名():fn.sayhi()
(3)建構函式 new star()
(4)繫結事件的函式 btn.οnclick=function(){}
(5)定時器函式 setinerval(function (){},1000)定時器每隔一秒鐘呼叫一次
(6)立即執行函式
(
function()
)()
function
foo(
)var a =
1foo()
const obj =
obj.
foo(
)const c =
newfoo
()
對於直接呼叫 foo 來說,不管 foo 函式被放在了什麼地方,this
一定是 window。
對於obj.foo()
來說,我們只需要記住,誰呼叫了函式,誰就是 this,所以在這個場景下 foo 函式中的this
就是 obj 物件。
對於 new 的方式來說,this
被永遠繫結在了 c 上面,不會被任何方式改變 this。
var o =
fn.(o,
['pink'])
fn.call
(o,'pink'
)//blind()方法不會呼叫函式,但是會改變函式內部的this指向
fun.
bind
(this
,arg1,arg2,
...)
blind()
中的this:在函式執行時指定的this值,args為傳遞的其他引數。如果有的函式我們不需要立刻呼叫,但是又想改變這個函式內部的this指向,此時需要用bind()。因為bind()返回的是乙個新的函式,你必須呼叫它才會被執行。
相同點:都可以改變函式內部的this指向
(3) bind不會呼叫函式,可以改變函式內部的this指向
主要應用場景:
(1)call()
主要用作子類繼承父類
(3) bind不呼叫函式,但是還想改變函式的this指向,比如改變定時器內部的this指向
箭頭函式與普通函式以及this指向問題
沒有引數只有單條語句 var fun consoloe.log 1 fun 乙個引數單條語句,可以省略 var fun a console.log 1 a就是傳入的單個引數多個引數多條語句 var fun a,b 返回的是物件要加 var fun var b return 1 var b new b...
建構函式以及this
實際上建構函式與普通的函式並沒有區別,所以一般在開發中會使用大駝峰命名規則來區別普通的函式,建構函式實際上是通過返回乙個this值來完成建構函式的建立的.這個rutern this的操作由new這個操作符來完成,當然個人也可以手動來設定return的返回值,手動設定的返回值會覆蓋由new所自動新增的...
建構函式以及this
實際上建構函式與普通的函式並沒有區別,所以一般在開發中會使用大駝峰命名規則來區別普通的函式,建構函式實際上是通過返回乙個this值來完成建構函式的建立的.這個rutern this的操作由new這個操作符來完成,當然個人也可以手動來設定return的返回值,手動設定的返回值會覆蓋由new所自動新增的...