call apply bind簡單理解

2021-10-01 04:06:08 字數 2021 閱讀 7298

js函式涉及到作用域時,函式定義時作用域以及很多東西無法確定,只有呼叫它時才能確定

作用是改變執行時上下文(作用域,即this),但是很多部落格解釋的非常複雜,這個解釋比較清楚,直接上**,上下兩段**等價。

function

add(c,d)

const obj =

; console.

log(add.

call

(obj,3,

4));

// 10

// 等價於

const o =};

console.

log(o.

add(3,

4))// 10

// 感覺相當於把add這個方法拉到obj這個作用域裡來

function

add(c,d)

const obj =

; console.

log(add.

(obj,[3

,4])

);// 10

// 或者

const e =[3

,4];

console.

log(add.

(obj, e));

// 10

bind 的作用和call很像,也會將它的第乙個引數變成函式執行時的作用域物件,後邊的引數作為函式的引數傳入,但是它的獨特型在於它會新建乙個函式,上述的作用發生在這個新的函式被呼叫時,而且,當這個新函式作為建構函式時,它當時繫結的this物件(也就是剛剛的第乙個引數)會失效,不過後邊的引數依然有效。

function

foo(c,d)

var func = foo.

bind(,

'no.1'

)func

('no.2'

)// 1

// 100

// no.1

// no.2

// 即使call也不能改變this

func.

call(,

'no3'

)// 1

// 100

// no.1

// no.3

// 當 bind 返回的函式作為建構函式的時候,

// bind 時指定的 this 值會失效,但傳入的引數依然生效。

// 所以使用func為建構函式時,this不會指向物件,this.a的值為undefined

newfunc

('no.4'

)

類陣列物件雖然可以訪問到某個鍵值,但是卻不能進行遍歷

es5和es6都有各自的方法實現:

const list = document.

getelementsbytagname

('li'

) console.

log(array.

isarray

(list)

)// 不是陣列

console.

log(list[2]

.innerhtml)

// 可以輸出其下某個元素的值

console.

log(list.foreach)

;// 無法進行遍歷

// es5方法將類陣列物件陣列化

var es5 = array.prototype.slice.

call

(list)

// 或者使用 var es5 = .slice.call(list)

console.

log(es5)

// es6方法將類陣列物件陣列化

var es6 = array.

from

(list)

console.

log(es6)

call, apply, bind方法詳解

function a x,y var c a.call c,5,6 5 6 arguments 5,6 再看例子 function person age,male var person1 person.call person1,20,female person1 var person var per...

手寫call,apply,bind函式

涉及面試題 考慮兩點 function.prototype.mycall function context context context window 和上面的 一樣 context.fn this const args arguments slice 1 const result context...

call apply bind方法詳解

var name window var newthis function showname info1,info2 showname a b 輸出 window a b 通過bind改變this指向 var newshowname showname.bind newthis,hello world ...