我们之前说过了call和apply两者的区别仅仅是第二参数的不同,call对的第二个参数 可以是任意字符,apply的第二个参数必须是数组。当然,第二个参数视需求而定,是可选的。
今天本来想写一个放大镜的效果,再找参考资料的时候 无意发现了一个bind方法,看到解释让我甚是感兴趣,改变函数对象内部的this指向。IE8以下不兼容:
"use strict";
var pi = 99;
var uk = {
pi:888,
app:function(){
return function(){
console.log(this.pi);
}
},
kk:{
pi:1235
}
};
function uxc(){}
uxc.prototype = {
pi:9527
}
uk.kk = new uxc;
var ii = uk.app().bind(uk.kk);
ii();
打印出来是95278,重点就是这句话起作用了:
uk.kk = new uxc;
改变了kk.pi变成9527;
bind返回的是函数,call和apply返回的是结果。
所以后面我还ii();执行了一下。
不过很多朋友推荐使用call和apply我觉得也是兼容好,而且利索。性能也比bind高。但是有一些情况还是会遇到使用bind的.下面下一个兼容:
if (!Function.prototype.bind) {
Function.prototype.bind = function(obj) {
var _self = this
,args = arguments;
return function() {
_self.apply(obj, Array.prototype.slice.call(args, 1));
}
}
}
_self.apply(obj, Array.prototype.slice.call(args, 1));
最后还是用到了apply和call方法来。
Array.prototype.slice.call(args, 1) //返回一个空数组.console.log(Object.prototype.toString.call(Array.prototype.slice.call(arr,0))=="[object Array]");//true apply一下 this就是obj了 接着再返回。