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,因此改變了函數作用域