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 函式執行了 那麼我們該怎麼模擬實現...