以前看过一些文档,一直以为自己懂了,今天一看其实懂的还是比较模凌两可。先说一些代码吧
fun.call(obj)
var a = { message: 'aa' } var b = function () { console.log(this.message) } b.call(a); //aa,这个很简单
obj.call(obj)
var a = { say: function () { console.log(this.message) } } var b = { message: 'bb' } a.say.call(b) //bb,这个也很简单
fun.call(fun)
function a () { this.message = "aa"; } function b () { this.message = "bb"; this.say = function () { console.log(this.message) console.log(this) } } var c = new a(); b.call(a) //bb a.say(); //函数a,这个结果和console.log(a)相同 b.call(c); //bb c.say(); //对象a,但是内容是b函数的,这个结果和console.log(c)相同 //console bb; function a() { this.message = "aa"; }; bb; a { message: "bb", say: function() };
我不知道你们有没有看懂这个输出,反正我一开始完全懵比。
当浏览器执行b.call(a)这一步的时候,a.say()的this指向指向b。
当浏览器执行b.call(c)这一步的时候,相当于执行了
this.message = "bb"; this.say = function () { console.log(this.message) console.log(this) }
说着说着,我又晕了。
反正当fun.call(fun)的时候,this指向前面那个fun。
当后面的fun为构造函数的时候,加入a.call(b),b为构造函数的时候,b会拥有a的方法,如果有重合的,则a的覆盖b的。
但是如果b不是构造函数的时候,b自身不会拥有a的方法,但是可以调用a的方法。
不过说句实话,在平常使用call和apply的时候,fun.call(fun)的例子也忒少了,基本都是使用obj.call(obj)。今天主要是被fun.call(fun)这个东西搞了。头都晕了。
如果有大神知道这其中的原理,就好好的帮我们解答一下啊!!谢谢了0.0