js模擬實現call和apply方法

2021-09-29 06:37:28 字數 1629 閱讀 6106

call() 方法在使用乙個指定的 this 值和若干個指定的引數值的前提下呼叫某個函式或方法。

例子:

var foo =

function

bar(

) bar.

call

(foo)

// 2

從這個例子中可以看出兩點:

上述例子試想當呼叫 call 的時候,把 foo 物件改造成如下:

var foo =};

foo.

bar();

// 2

這個時候的this就指向了foo函式了,但是foo物件又新增了乙個多餘的屬性,因此我們需要bar用delete給刪除就行了。

因此模擬的步驟分為三步:

將函式設為物件的屬性

執行該函式

刪除該函式

以上述例子:

// 第一步

foo.fn = bar

// 第二步

foo.fn(

)// 第三步

delete foo.fn

fn 是物件的屬性名,反正最後也要刪除它,所以起成什麼都無所謂。

var value =

3var foo =

function

bar(name,age)

function.prototype.

call2

=function

(context)

eval

('context.fn('

+args+

')')

// 執行了args.push('arguments[' + i + ']')後

// args = [ 'arguments[1]', 'arguments[2]' ]包含2個字元

// 然後執行eval('context.fn(' + args + ')')

// +令 args 執行 args.tostring() 相當於eval('context.fn(' + 『arguments[1], arguments[2]』+ ')')

// 字串合併,即eval('context.fn( arguments[1], arguments[2] )')

// 執行context.fn( arguments[1], arguments[2] )

delete context.fn

} bar.

call2

(null

)// 3 undefinde undefinde

bar.

call2

(foo,

'cc',18

)// 2 cc 18

實現原理和call差不多

function.prototype.

=function

(context, arr)

else

result =

eval

('context.fn('

+ args +

')')

}delete context.fn

return result;

}

js中call和apply的模擬實現

示例 call的正常使用 var key windowk var obj function fn name,age fn lucy 20 name lucy age 20 this.key windowk fn.call obj,lucy 20 name lucy age 20 this.key o...

5 模擬實現call和apply

1 先來看call的乙個例子 1 var value 1 2var foo 56 function bar 910 bar.call foo 1 猜想 假設在執行call的時候,把bar函式新增到foo物件下,執行foo.bar,具體如下 1 var foo 6 78 foo.bar 1 這就是我們...

call和apply的模擬實現

一句話介紹 call call 方法在使用乙個指定的 this 值和若干個指定的引數值的前提下呼叫某個函式或方法。舉個例子 var foo function bar bar.call foo 1 注意兩點 call 改變了 this 的指向,指向到 foo bar 函式執行了 那麼我們該怎麼模擬實現...