1、call的模擬實(shí)現(xiàn)
- 完成了 this 的綁定
- 完成了參數(shù)的傳遞
- 若傳入的是 null ,則綁定 this 為 window
- 有返回值
- 模擬的是非嚴(yán)格模式下的
Function.prototype.call2 = function(context){
context = context || window
context.fn = this;
var arr=[];
for(var i=1;i<arguments.length;i++){
arr.push(arguments[i]);
}
var result = context.fn(...arr);
delete context.fn;
return result;
}
var value = 3;
var foo = {
value:2
}
function bar (a,b){
console.log(a,b,this.value)
return {
'a':a,
'b':b,
'value':this.value
}
}
bar.call2(null,"aa","bb");
console.log(bar.call2(foo,"aa","bb"))
- 使用擴(kuò)展運(yùn)算符... 即 var result = context.fn(...arr);
- 擴(kuò)展運(yùn)算符是 ES6 中才有的,es5 中使用 var result = eval('context.fn(' + args +')');會(huì)把 args 數(shù)組解析開
- 了解eval() 函數(shù),該函數(shù)就是用JavaScript的解析引擎來解析傳入字符串里面的內(nèi)容
apply 模擬實(shí)現(xiàn)
Function.prototype.apply = function (context, arr) {
var context = Object(context) || window;
context.fn = this;
var result;
if (!arr) {
result = context.fn();
}
else {
var args = [];
for (var i = 0, len = arr.length; i < len; i++) {
args.push('arr[' + i + ']');
}
result = eval('context.fn(' + args + ')')
}
delete context.fn
return result;
}
- 中間把 arr 的值 push 到 args 里是因?yàn)椋琣rguments 是一個(gè)類數(shù)組,直接使用 arr 的話,傳遞的是一個(gè)對(duì)象
嚴(yán)格模式和非嚴(yán)格模式的區(qū)別
- 在非嚴(yán)格模式下,null 和 undefined 會(huì)指向 window ,而在嚴(yán)格模式下,指向 undefined
- 直接調(diào)用函數(shù)的時(shí)候 fn() 非嚴(yán)格模式下,this 指向 window ,嚴(yán)格模式下指向 undefined (見this指向的筆記)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。