戏说js的call, apply 和 bind (文章内容可能引起逻辑严谨的程序员的不适,慎入!)
2017-03-30 14:52
288 查看
有两个对象,他们的名字叫obj1, 和obj2。
他们很像,但是其实是生活在不同的平行空间中,彼此不能相见。
下面请看看他们长什么样子。
obj1 有自身的法力因子power, 可以在周边接收两种元素,分别是elem1和elem2。
当念出法力名inc (increase的缩写)的时候,就会增加食物来支撑他走下去。
所以他就一直念:
食物一次增长一点,每施法获取食物的时候,法力因子就会增加一次。
这些法力因子和食物越来越多,越来越重。obj1非常着急,现在已经多得背不动了。
如果再不卸掉点power和食物,就会在旅行途中被压死。
情况异常紧急!
我们再来看看obj2的处境。
obj2也有个自身的法力因子power, 也可以在周边接收两种元素,分别也是elem1和elem2。
他的法力刚好和obj1相反,当念出法力名dec( decrease的缩写)的时候,就会一点一点消耗现有的power以获取食物。
每次饿了的时候他就施一次法。可是power越少,食物就越少。
而且只减不增。
这时他掏出自己的power 一看。卧槽! 他已经快没有法力了。
怎么办?obj2随时都有被饿死的危险!
我们在将场景切回到obj1这里。
obj1趴在地上走不动了,心里面想:如果我现在有个电话能call给上帝,让他帮我卸掉点power那我就能活过来了。
就在这时,奇妙的事情发生了。
他发现身边多了一个电话。
这时候电话那一头突然传来了声音:请按 O- B - J - 2 - . - D- E -C。
obj2毫不犹豫的按下了所指示的按键, 并且下意识的紧紧抓住 elem1 = 1, 和 elem2 = 2。
当时情景描述如下:
突然狂风大作,砂石横飞。
一阵眩晕过后, obj1 睁开眼,突然发现人轻松了不少。
食物变少了。这时他又取出了自己的power查看:
OMG!power居然可以减少了,简直是奇迹啊。
obj1 狂喜,接连又打了几次电话。
又掏出power查看:
哇塞,已经度过危险期了,整个人都感觉都飞起来了,哈哈!
好了,obj1的危险警报已经解除,咱们再来关心加obj2吧。
obj2现在已经饿得瘫在了地上。
心里也想: 如果我现在有个电话能call给上帝,让他帮我增加点power那我就能活过来了。
然并卵,电话没有出现。
等了半天, 突然发现地上有张申请表。
申请表提示写下下面这行信息 obj1.inc。
obj2照着写了,并且下意识的紧紧抓住 elem1 = 1, 和 elem2 = 2。
还是然并卵。
obj2就快崩溃了。
就在这时,突然看见申请表最右下方有一行小字:
请将手上的所有elements组合成一个整体。
obj2细细观察elem1和elem2,发现它们居然像卯榫一样可以耦合。
于是花了点时间它们拼了起来。
obj2心里想:如果还不发生奇迹,我就疯了。
果然,奇迹晚了点,但还是来了。
当时情景描述如下:
掏出power 一看, 我擦!居然也比原来增加一点。
于是他在申请表上又重复写了两次, power 增加到了 4。食物也增加到了7。
终于又活过来了。
可是对于obj1和obj2高兴是暂时的。
电话和申请表都被锁在当场,带不走。
只有拿起电话和填上申请表才能发挥作用。
obj1 和 obj2都有要事在身,需要马上上路。
可是以后的路怎么办呢?
他们都在想,如果能把这种神奇的力量提炼出来绑在自己的身上那该多好啊。
人背起来喝凉水都塞牙,可是人顺起来也是好运挡也挡不住。
obj1, 和 obj2 都发现了 腰带上面印了一行字。
obj1的腰带印的是:obj2.dec; 而obj2上的腰带印的是obj1.inc. 当时情景描述如下:
obj1 按下了腰带上的按钮,并且抓住 elem1和elem2:
食物继续减少,power也在减少,之前是7。完美!
obj2按下了了腰带上的按钮,并且把elem1和elem2拼成的整体抓在手上。
我靠!腰带输出乱码。 ‘
undefined’是个什么东东啊,从来没看过,欺负俺不认识英文是吧,套路太深。
虽然power是增加了,但是没有食物啊。
obj2又要绝望了。你说他怎么就是比obj1坎坷点呢。
但是好在obj2是个锲而不舍的对象。
他仔细的把皮带脱下来研究了下,终于找到了一点端倪。
原来在皮带大按键下还有 三个小点按键。
好,老子再试!
哈哈哈,终于又成功了。 食物有增长,power也有增长!完美中的完美啊!
两位都解围了,obj1 和 obj2又兴冲冲的赶路了。
他们可以通过自身的法力,以及神奇腰带的附加法力平衡食物和power。
后来他们又发现了更为方便的方法。
把elem1 =1 和elem2=2直接绑在腰带上, 就不用每次抓着施法那么麻烦了。
当时场景描述如下:
他们还将遇到什么困难和奇葩的事情呢?
请听下回分解!
他们很像,但是其实是生活在不同的平行空间中,彼此不能相见。
下面请看看他们长什么样子。
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]); // b986 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( );
他们还将遇到什么困难和奇葩的事情呢?
请听下回分解!
相关文章推荐
- js apply/call/caller/callee/bind使用方法与区别分析
- js apply/call/caller/callee/bind使用方法与区别分析
- js中call、apply、bind的用法
- js apply/call/caller/callee/bind使用方法与区别分析
- js apply/call/caller/callee/bind使用方法与区别分析
- js apply/call/caller/callee/bind使用方法与区别分析
- js call apply caller callee bind
- js apply/call/caller/callee/bind使用方法与区别分析
- node.js学习笔记之call,apply,bind
- js apply/call/caller/callee/bind使用方法与区别分析
- js中bind,call,apply方法的应用
- js apply/call/caller/callee/bind使用方法与区别分析
- js: this,call,apply,bind 总结
- js apply/call/caller/callee/bind使用方法与区别分析
- js中call、apply、bind的用法
- js function call,apply,bind方法
- JS中的call、apply、bind方法
- js apply/call/caller/callee/bind使用方法与区别分析
- JS中的apply,call,bind深入理解
- js call apply bind简单的理解