實現call函式,手寫Function.prototype.call函式
實現call函式:
使用call函式:
function fn(x,y){
console.log(this);
return x+ y
}
let obj = {
name:'李雲龍'
}
//1.普通使用
fn(10,20) // this---->window,30
//2.使用call
fn.call(obj,10,20)// this--->obj , 30
思路:
- 為obj新增一個屬性,屬性值就是fn
- 執行那個新增的屬性(方法),獲取返回值,將返回值返回
- 刪除我們新增的屬性
Function.prototype.myCall = function(context,...params){
//此時context---->就是obj
//此時this----->fn
context.xxx = this //為這個物件新增一個方法
let result = context.xxx(...params);//執行這個方法,獲取返回值
delete context.xxx;//刪除我們新增的那個屬性,我們不能改變原本的物件結構
return result
}
//------------------驗證----------------------
function fn(x,y){
console.log(this.name);
return x+ y
}
let obj = {
name:'李雲龍'
}
//1.普通使用
fn(10,20) // this---->window,30
//2.使用call
fn.myCall(obj,10,20)// this--->obj , 30
進一步完善
- 我們新增的屬性,如果和原本的物件的屬性一樣,那麼就會發生改變原來的屬性,這是不允許的
- 對context進行處理,如果是null,那麼就是window,
- 如果context是基本型別值,那麼需要將基本型別值轉化為對應的引用型別值
- new context.constructor(),時一般都可以,但是如果context時Symbol型別,那麼就會報錯,它不允許被new
Function.prototype.myCall = function(context,...params){
//context ---> 一個物件,我們需要改變的this為context
//this---->就是那個函式
context == null ? context = window : null
//如果傳入的是一個null或者是undefined那麼,context就是window,否則什麼都不做
!/^(object|function)$/.test(typeof context)?context = Object(context):null
let key = Symbol('key');
context[key] = this;
//這個是為context新增一個屬性,屬性值為一個函式(this就是一個函式)
let result = context[key](...params);
//我們執行context這個物件中的一個方法,就是執行了 this這個函式,並且獲得函式執行的返回值
delete context[key];
//最後刪除一個我們新增的那個屬性
return result
//那麼我就需要返回這個函式執行的結果
}
//-----------------驗證--------------------
function fn(x,y){
console.log(this.name);
return x+ y
}
let obj = {
name:'李雲龍'
}
//1.普通使用
fn(10,20) // this---->window,30
//2.使用call
fn.myCall(20,10,20)//傳入的是一個基本型別的值 this--->20 , 30
相關文章
- 手寫JS函式的call、apply、bindJS函式APP
- 手寫系列:call、apply、bind、函式柯里化APP函式
- call仿函式函式
- [手寫系列] Spirit帶你實現防抖函式和節流函式函式
- (函式)實現strstr函式函式
- 手寫JavaScript常用的函式JavaScript函式
- javascript使用call()函式實現繼承程式碼例項JavaScript函式繼承
- js的call函式”原始碼”JS函式原始碼
- 遞迴匿名函式手動實現 http_build_query 系統函式遞迴函式HTTPUI
- 手寫一個bind函式(大概)函式
- 箭頭函式、簡寫函式、普通函式的區別函式
- 在建構函式內使用call()或apply()實現繼承函式APP繼承
- JavaScript的迭代函式與迭代函式的實現JavaScript函式
- 函式節流、函式防抖實現原理分析函式
- js中call、apply、bind函式JSAPP函式
- SAP 的CALL FUNCTION 函式彙總Function函式
- 函式式JavaScript(3):.apply()、.call() 和arguments物件函式JavaScriptAPP物件
- MySQL排名函式實現MySql函式
- MySQL分析函式實現MySql函式
- fcntl函式實現dup函式
- Function.prototype.callFunction
- call_user_func()與call_user_func_array函式函式
- [譯] 編寫函式式的 JavaScript 實用指南函式JavaScript
- 理解JS函式之call,apply,bindJS函式APP
- javascript call()函式用法簡單介紹JavaScript函式
- (函式分治法)實現pow函式(x的y次方冪)函式
- 不使用日期函式實現ADD_MONTHS函式功能函式
- 一個有用的函式-實現dump函式的convert!函式
- 手寫CommonJS 中的 require函式JSUI函式
- WPF啟動流程-自己手寫Main函式AI函式
- MySQL函式大全(字串函式,數學函式,日期函式,系統級函式,聚合函式)MySql函式字串
- Go 實現字串首字母大、小寫函式Go字串函式
- NIST 函式手冊函式
- async 函式的實現原理函式
- 去抖函式的實現函式
- Golang實現PHP常用函式GolangPHP函式
- Go實現PHP常用函式GoPHP函式
- bind 函式的實現原理函式