一、call()函数和apply()函数
先举个简单的例子
function add(a,b) { alert(a+b); } function sub(a,b) { alert(a-b); } add.call(sub,1,1);
这里的结果是2还是0 ???
先看这里
用猿话来说!!!!
call的用法和意义
call和apply可以用来重新定义函数的执行环境,也就是this的指向;
call 和 apply 都是为了改变某个函数运行时的 context
即上下文而存在的 换句话说,就是为了改变函数体内部 this 的指向。因为 JavaScript 的函数存在「定义时上下文」和「运行时上下文」以及「上下文是可以改变的」这样的概念。
语法:call(Obj,[arg1][arg1])
用人话来说就是!!!!
就是中间牵线的,sub说 我需要 add 你的方法 和技能,
比如:add会飞天 ,但sub 不会飞,现在sub想飞,但add不让它飞,所以sub就叫来了 call 这个东西, call直接把add爆菊
加上一个 点 然后把sub抱到括号里,然后 sub 就直接把add 的“飞天”技能学会了
回到函数上来
1 function add(a,b) 2 { 3 alert(a+b); 4 } 5 function sub(a,b) 6 { 7 alert(a-b); 8 } 9 10 add.call(sub,1,1); 11 // 结果是 sub直接集成了 add 的“飞天”技能 sub alert里面 直接变成了 “a+b”!主角还是sub,并不是add ,你要搞清楚!
所以最后的答案为2
什么时候用到call和apply呢?
1 function changeStyle(attr, value) 2 { 3 this.style[attr] = value; 4 } 5 var box = document.getElementById('box'); 6 window.changeStyle.call(box, "height", "200px");
在这里,changeStyle函数将被box对象调用,this指向了box对象,如果不用call的话,程序报错,因为
window对象中没有style属性。apply的用法:
window.changeStyle.apply(box, [‘height’, ‘200px’]);
现在 window对象 “box” 这个div 的高 直接变成200px了,
window.changeStyle.call(box, “height”, “200px”)
等价于 box.style.height=”200px”;
看了这个写法 你应该明白了把, 啊哈其实 就是写法 和形式不同而已,本质是一样的,apply(),是推进到 数组里而已,也是为了改变this、 这个,也是为了偷 add 的飞天技能哈! 总结一句话:call() 就是用来让括号里的对象 来集成括号外的函数的属性!可以称之为继承!
之后去面试被面试官问道了这个问题,心中一阵暗喜,but......
面试官:这个其实只是sub把add里面的属性方法复制过来,呢么真正的继承呢?
我:propotype?
博客原址
http://blog.csdn.net/xllily_11/article/details/51480723
想了解更详细的继承,推荐看
http://blog.csdn.net/liuyan19891230/article/details/50774439
http://blog.csdn.net/kkkkkxiaofei/article/details/46474069