戏说js的call, apply 和 bind (文章内容可能引起逻辑严谨的程序员的不适,慎入!)

有两个对象,他们的名字叫obj1, 和obj2。

他们很像,但是其实是生活在不同的平行空间中,彼此不能相见。

下面请看看他们长什么样子。

var obj1 = {
    power: 8,
    inc: function (elem1, elem2) {
        this.power++;
        var food = this.power + elem1 + elem2;
        console.log(food);
    }
};

var obj2 = {
    power: 3,
    dec: function (elem1, elem2) {
        this.power--;
        var food = this.power + elem1 + elem2;
        console.log(food);
    }
};

obj1 有自身的法力因子power, 可以在周边接收两种元素,分别是elem1和elem2。

当念出法力名inc (increase的缩写)的时候,就会增加食物来支撑他走下去。

所以他就一直念:

obj1.inc(1,2); // 12
obj1.inc(1,2); // 13

食物一次增长一点,每施法获取食物的时候,法力因子就会增加一次。

这些法力因子和食物越来越多,越来越重。obj1非常着急,现在已经多得背不动了。

如果再不卸掉点power和食物,就会在旅行途中被压死。

情况异常紧急!

console.log(obj1.power); // 10

我们再来看看obj2的处境。

obj2也有个自身的法力因子power, 也可以在周边接收两种元素,分别也是elem1和elem2。

他的法力刚好和obj1相反,当念出法力名dec( decrease的缩写)的时候,就会一点一点消耗现有的power以获取食物。

每次饿了的时候他就施一次法。可是power越少,食物就越少。

而且只减不增。

obj2.dec(1,2); // 5
obj2.dec(1,2); // 4

这时他掏出自己的power 一看。卧槽! 他已经快没有法力了。

怎么办?obj2随时都有被饿死的危险!

console.log(obj2.power) // 1

我们在将场景切回到obj1这里。

obj1趴在地上走不动了,心里面想:如果我现在有个电话能call给上帝,让他帮我卸掉点power那我就能活过来了。

就在这时,奇妙的事情发生了。

他发现身边多了一个电话。

这时候电话那一头突然传来了声音:请按 O- B - J - 2 - . - D- E -C。

obj2毫不犹豫的按下了所指示的按键, 并且下意识的紧紧抓住 elem1 = 1, 和 elem2 = 2。

当时情景描述如下:

obj2.dec.call(obj1, 1, 2); // 12 

突然狂风大作,砂石横飞。

一阵眩晕过后, obj1 睁开眼,突然发现人轻松了不少。

食物变少了。这时他又取出了自己的power查看:

console.log(obj1.power); // 9

OMG!power居然可以减少了,简直是奇迹啊。

obj1 狂喜,接连又打了几次电话。

obj2.dec.call(obj1, 1, 2); // 11 
obj2.dec.call(obj1, 1, 2); // 10

又掏出power查看:

console.log(obj1.power); // 7

哇塞,已经度过危险期了,整个人都感觉都飞起来了,哈哈!

好了,obj1的危险警报已经解除,咱们再来关心加obj2吧。

obj2现在已经饿得瘫在了地上。

心里也想: 如果我现在有个电话能call给上帝,让他帮我增加点power那我就能活过来了。

然并卵,电话没有出现。

等了半天, 突然发现地上有张申请表。

申请表提示写下下面这行信息 obj1.inc。

obj2照着写了,并且下意识的紧紧抓住 elem1 = 1, 和 elem2 = 2。

还是然并卵。

obj2就快崩溃了。

就在这时,突然看见申请表最右下方有一行小字:

请将手上的所有elements组合成一个整体。

obj2细细观察elem1和elem2,发现它们居然像卯榫一样可以耦合。

于是花了点时间它们拼了起来。

obj2心里想:如果还不发生奇迹,我就疯了。

果然,奇迹晚了点,但还是来了。

当时情景描述如下:

obj1.inc.apply(obj2,[1,2]); // 5

掏出power 一看, 我擦!居然也比原来增加一点。

console.log(obj2.power); // 2

于是他在申请表上又重复写了两次, power 增加到了 4。食物也增加到了7。

终于又活过来了。

obj1.inc.apply(obj2,[1,2]); // 6
obj1.inc.apply(obj2,[1,2]); // 7
console.log(obj2.power); // 4

可是对于obj1和obj2高兴是暂时的。

电话和申请表都被锁在当场,带不走。

只有拿起电话和填上申请表才能发挥作用。

obj1 和 obj2都有要事在身,需要马上上路。

可是以后的路怎么办呢?

他们都在想,如果能把这种神奇的力量提炼出来绑在自己的身上那该多好啊。

人背起来喝凉水都塞牙,可是人顺起来也是好运挡也挡不住。

obj1, 和 obj2 都发现了 腰带上面印了一行字。

obj1的腰带印的是:obj2.dec; 而obj2上的腰带印的是obj1.inc. 当时情景描述如下:

var belt1 = obj2.dec.bind(obj1);
var belt2 = obj1.inc.bind(obj2); 

obj1 按下了腰带上的按钮,并且抓住 elem1和elem2:

belt1(1,2); // 9
console.log(obj1.power); // 6

食物继续减少,power也在减少,之前是7。完美!

obj2按下了了腰带上的按钮,并且把elem1和elem2拼成的整体抓在手上。

belt2([1,2]); // 51,2undefined
console.log(obj2.power); // 5

我靠!腰带输出乱码。 ‘

undefined’是个什么东东啊,从来没看过,欺负俺不认识英文是吧,套路太深。

虽然power是增加了,但是没有食物啊。

obj2又要绝望了。你说他怎么就是比obj1坎坷点呢。

但是好在obj2是个锲而不舍的对象。

他仔细的把皮带脱下来研究了下,终于找到了一点端倪。

原来在皮带大按键下还有 三个小点按键。

好,老子再试!

belt2(...[1,2]); // 9
console.log(obj2.power); // 6

哈哈哈,终于又成功了。 食物有增长,power也有增长!完美中的完美啊!

两位都解围了,obj1 和 obj2又兴冲冲的赶路了。

他们可以通过自身的法力,以及神奇腰带的附加法力平衡食物和power。

后来他们又发现了更为方便的方法。

把elem1 =1 和elem2=2直接绑在腰带上, 就不用每次抓着施法那么麻烦了。

当时场景描述如下:

var belt1 = obj2.dec.bind(obj1, 1, 2);
belt1( );

var belt2 = obj1.inc.bind(obj2, ...[1,2]); 
belt2( );

他们还将遇到什么困难和奇葩的事情呢?

请听下回分解!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值