亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

使用模擬實現的方式探究call 和 apply 的原理

標簽:
JavaScript

使用模拟实现的方式探究call 和 apply 的原理

call

作用:

call() 方法就是在使用一个指定 this 值和若干个指定的参数值的前提下调用某个函数或者方法。

var foo = {    value : 1}function bar() {    console.log(this.value)
}// 如果不对this进行绑定执行bar() 会返回undefinedbar.call(foo) // 1

也就是说call()改变了 this 的指向到了 foo

下面进行一下模拟实现

试想当调用 call 的时候,也就是类似于

var foo = {    value: 1,    bar: function() {        console.log(this.value)
    }
}
foo.bar() // 1

这样就把 this 指向到了 foo 上,但是这样给 foo 对象加了一个属性,有些瑕疵,不过不要紧,执行完删除这个属性就可以完美实现了。

也就是说步骤可以是这样:

  1. 将函数设为对象的属性

  2. 执行这个函数

  3. 删除这个函数

下面就试着去实现一下:

Function.prototype.call2 = function(context) {
    context.fn = this // this 也就是调用call的函数
    var result = context.fn()    delete context.fn()    return result
}var foo = {    value: 1}function bar() {    console.log(this.value)
}
bar.call2(foo) // 1

但是这样有一个小缺陷就是call() 不仅能指定this到函数,还能传入给定参数执行函数比如:

var foo = {    value: 1}function bar(name, age) {    console.log(name)    console.log(age)    console.log(this.value)
}
bar.call(foo, 'black', '18')// black// 18// 1

特别要注意的一点是,传入的参数的数量是不确定的,所以我们要使用arguments 对象,取出除去第一个之外的参数,放到一个数组里:

Function.prototype.call2 = function(context) {
    context.fn = this // this 也就是调用call的函数
    var args = [...arguments].slice(1)    var result = context.fn(...args)    delete context.fn()    return result
}var foo = {    value: 1}function bar(name, age) {    console.log(name)    console.log(age)    console.log(this.value);
}
bar.call2(foo, 'black', '18') // black 18 1

还有一点需要注意的是,如果不传入参数,默认指向为 window,所以最终版代码:

Function.prototype.call2 = function(context) {    var context = context || window
    context.fn = this // this 也就是调用call的函数
    var args = [...arguments].slice(1)    var result = context.fn(...args)    delete context.fn()    return result
}var value = 1function bar() {    console.log(this.value)
}
bar.call2()

apply

apply的方法和 call 方法的实现类似,只不过是如果有参数,以数组形式进行传递,直接上代码:

Function.prototype.apply2 = function(context) {    var context = context || window
    context.fn = this // this 也就是调用apply的函数
    var result    // 判断是否有第二个参数
    if(arguments[1]) {
        result = context.fn(...arguments[1])
    } else {
        result = context.fn()
    }    delete context.fn()    return result
}var foo = {    value: 1}function bar(name, age) {    console.log(name)    console.log(age)    console.log(this.value);
}
bar.apply2(foo, ['black', '18']) // black 18 1



作者:宿雨jj
链接:https://www.jianshu.com/p/92b48caee4b2


點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消