一、call、apply的对比
1、参数:
二者均接受两个参数,第一个参数,是在其中运行函数的作用域,也可以理解为第一个参数传入哪个对象名,则在函数中的this转为指向该对象;若传入的是this,则代表函数本来的作用域。
第二个参数,对于call()则需要将函数的参数逐个列举,对于apply()则传入参数数组或arguments对象。(二者区别仅为此)
2、call、apply的用途:
-
在特定的作用域内调用函数,即设置函数体内this对象的值。
-
扩充函数赖以运行的作用域,对象不需要与方法有任何耦合关系。
二、bind()
1、用途
创建一个函数的实例,第一个参数即绑定this的值,即this的指向,后面接收传递给函数的不定参数,依次列举。
2、不同点:
- bind返回的是改变上下文this后的函数,call是改变上下文this并执行函数,最终返回结果值。
-
bind获取第二个及以后的参数并用于之后的方法执行,但方法中传入的实参会在bind传入参数的基础上向后排;call是把第二个及以后的参数作为f方法的实参传进去。
三、代码
1、
var func=new function(){this.a="func"} var myfunc=function(x,y){ var a="myfunc"; alert(this.a); alert(x + y); } myfunc.call(func,"var"," fun");// "func" "var fun" myfunc.apply(func,["var"," fun"]);// "func" "var fun"
2、
<script type=
"text/javascript"
>
var
name =
"sharpxiajun"
;
function
ftn(name){
console.log(name);
console.log(
this
.name);
console.log(
this
);
}
ftn(
"101"
);
var
obj = {
name:
"xtq"
};
ftn.call(obj,
"102"
);
</script>
结果如下:101VM96:5 sharpxiajunVM96:6 WindowVM96:4 102VM96:5 xtq
3、
<script>
var func=new function(){this.a="func"}
var myfunc=function(x){
var a="myfunc";
alert(this.a);//func
alert(x);//var
}
myfunc.call(func,"var");
</script>
var func=new function(){this.a="func"}
var myfunc=function(x){
var a="myfunc";
alert(this.a);//func
alert(x);//var
}
myfunc.call(func,"var");
</script>
4、
function f(a,b,c){ console.log(a,b,c); } var f_Extend = f.bind(null,"extend_A")
f("A","B","C") //这里会输出--> A B C
f_Extend("A","B","C") //这里会输出--> extend_A A B
f_Extend("B","C") //这里会输出--> extend_A B C
f.call(null,"extend_A") //这里会输出--> extend_A undefined undefined