js函式以及this指向問題

2021-10-11 13:39:23 字數 1944 閱讀 1879

函式的定義的有三種方式:自定義函式、函式表示式(字面量)以及利用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所自動新增的...