js中this,call,apply方法说明
this:this对象是指在运行时期基于运行环境所绑定的也就是说this总是指向调用者
代码说明:
var k=10;
function test(){
this.k=20;
}
test();//test()<===>window.test()
alert(test.k);//undefined
alert(k)//20
/*说明:this:this对象是指在运行时期基于运行环境所绑定的也就是说this总是指向调用者;
代码分析: 1.var k=10;相当于window.k=10;
2.test函数中的this指向的是全局作用域中的window对象,所以此时this.k等价于window.k,
由于this.k重新赋值了20,所以此时k就等于20,
而test.k由于是个函数的局部变量,
所以,test.k并没有赋值,所以弹出undefined
*/
call,apply方法:
- 每一个函数都包含两个非继承而来的方法,call,apply,这两个方法用途都是在特定的作用域中调用函数,实际上等于设置函数体内的this对象的值;
- 简单用法:绑定一些函数,用于传参调用;
- 扩充函数作用域,使用扩充作用域的好处是对象与函数没有任何耦合关系
代码说明:
//简单用法:绑定一些函数,用于传参调用;
function add(x,y){
return x+y;
}
function call1(a,b){
//在test函数中调用add方法并且将test函数的参数传递给add方法
return add.call(this,a,b);
}
call1(1,2);//返回值为3
function apply1(c,d){
//apply方法和call方法运行效果是一样的,但是call传递普通参数,但是,apply传递是一个数组;
return add.apply(this,[c,d]);
}
apply1(1,2);//返回值为3
//扩充函数作用域实例
window.color="red";
var obj={color:"green"};
function showColor(){
alert(this.color);
}
showColor.call(this);//red;this就是window;
showColor.apply(obj);//green,因为绑定的是obj,因此改变了函数作用域