<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
面試官 :說一下 call apply bind 的三者區別吧?
我:啊.....這。
我們先來看看 call
call 函數接收兩個引數
@params1
需要指向this
@params2
需要攜帶的引數
就拿這段程式碼 來說 我呼叫 foo 函數 的時候 想去 執行obj 中的 eat函數 怎麼辦?
預設 我的 foo 裡面什麼頁面有 怎麼可能會列印 吃飯呢?this預設指向 window ,window 物件中 沒有 eat 方法不應該 報錯 not defind 嗎?
let obj = { eat: function (args) { console.log("吃飯", args); } } function foo(...args) { this.eat(args) }
你可以這樣 , 此時呼叫的時候 foo 的函數 this 就指向了 obj 但是隻是這一次呼叫哦 ,下次 this 是指向 window
的
console.log(foo.call(obj, 123, 456)); / / 吃飯 [ 123, 456 ]
呼叫結果
: 傳入 this 和 引數 立即執行函數
@params1
需要指向this
@params2
需要攜帶的引數 傳入的引數資料型別為 Array
let obj = { eat: function (args) { console.log("吃飯", args); } } function foo(...args) { this.eat(args) }
console.log(foo.apply(obj, [1, 2, 3])); // 吃飯 [1,2,3 ]
呼叫結果
: 傳入 this 和 引數,立即執行
@params1
需要指向this
@params2
需要攜帶的引數
let obj = { eat: function (args) { console.log("吃飯", args); } } function foo(...args) { this.eat(args) }
console.log(foo.bind(obj, 1, 2, 3)()); //吃飯 [ 1, 2, 3 ]
呼叫結果 : 傳入 this 和 引數 返回一個 新的函數,不會立即執行
call
函數 傳入繫結 this的物件 ,攜第二個引數以 參數列形式傳入 並會立即執行
apply
函數 傳入繫結 this的物件 第二個引數以 陣列的形式 傳入 並會立即執行
bind
函數 傳入繫結 this的物件 第二個引數以 陣列或參數列的形式傳入 不會立即執行函數會返回一個新的函數 自由呼叫
利用call 實現 建構函式原型繼承
function Person(name, age, friends) { this.friends = friends this.name = name this.age = age } Person.prototype.eat = function () { console.log(`${this.name}在吃飯`); } Person.prototype.running = function () { console.log(`${this.name}去跑步了`); } function Student(study, name, age, friedns) { Person.call(this, name, age, friedns) this.study = study } function Teacher(plaseLoveStudent) { this.plaseLoveStudent = plaseLoveStudent } //繼承 person Student.prototype = new Person() const stu = new Student('語文', "張三", 18, ['王安石']) const stu2 = new Student('數學', "李四", 18, ['哈利波特']) const tec = new Teacher("王安怡") console.log(stu === stu2); console.log(stu); console.log(stu.friends); console.log(stu2.friends);
實現思路 :
1:在Function 原型身上新增一個方法。
2:mycall 接受 兩個引數 一個是繫結的 this,還有就是 參數列
3:儲存呼叫者,其實這裡更嚴謹一點還需要判斷呼叫者的 型別
4:判斷傳入的thisArgs 是不是 undefined 或者 null 如果是 則 this指向 window 否則將 繫結的 this封裝成 一個物件
5:然後將 函數本身儲存在 上面封裝好的物件中
6:呼叫並傳入args
7:完成實現 this指向的改變
Function.prototype.mycall = function (thisArgs, ...args) { /** * * 儲存this(當前呼叫者) * */ const newFunc = this // 在當前呼叫者 this身上 儲存 呼叫者 thisArgs = (thisArgs !== undefined && thisArgs !== null) ? Object(thisArgs) : window thisArgs.func = newFunc thisArgs.func(...args) }
apply 就不說了 實現思路是一樣的 只不過傳入的引數不一樣做一個判斷就行了
Function.prototype.myapply = function (thisArgs, argArray) { if (!(argArray instanceof Array)) { throw '引數型別限定為 Array' } else { const func = this thisArgs = (thisArgs !== undefined && thisArgs !== null) ? Object(thisArgs) : window thisArgs.fn = func thisArgs.fn(argArray) } }
bind 跟 apply call 有一些區別
bind 會返回一個新的函數 , 所以我們在內部需要自己定義一個 函數 給返回出去, 並且,可能出現 返回新函數呼叫時 繼續傳入引數 所以我們需要將引數合併
Function.prototype.mybind = function (thisArgs, ...argArray) { const oldFunc = this console.log(this); thisArgs = (thisArgs !== undefined && thisArgs !== null) ? Object(thisArgs) : window function proxyFn(...args) { thisArgs.func = oldFunc const funcCallResult = thisArgs.func([...argArray, ...args]) // 合併兩次的 引數 delete thisArgs.func return funcCallResult } return proxyFn }
謝謝,到此就完成了簡單版的 call apply bind 的實現,更多關於JS call apply bind方法的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45