以前看过一些文档,一直以为自己懂了,今天一看其实懂的还是比较模凌两可。先说一些代码吧

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

 posted on 2017-04-10 17:22  Yhspehy  阅读(460)  评论(0编辑  收藏  举报