函數中的this指向和當前函數在哪定義的或者在哪執行的都沒有任何的關係分析this指向的規律如下:[非嚴格模式]1、自執行函數中的this永遠是window [案例1] var obj={ fn:(function(i){ //this->window return function(){ //th
函數中的this指向和當前函數在哪定義的或者在哪執行的都沒有任何的關係
分析this指向的規律如下:
[非嚴格模式]
1、自執行函數中的this永遠是window
[案例1]
var obj={
fn:(function(i){
//this->window
return function(){
//this->obj
}
})(0)
};
obj.fn();
2、給元素的某個行為綁定一個方法,當行為觸發的時候,執行綁定的方法,此時方法中的this是當前的元素
[案例1]
oDiv.onclick=function(){
//this->oDiv
};
[案例2]
function fn(){
//this->window
}
oDiv.onclick=function(){
//this->oDiv
fn();
};
3、方法執行,看方法名前面是否有".",有的話,"."前面是誰this就是誰,沒有的話this就是window
[案例1]
var obj={fn:fn};
function fn(){}
fn.prototype.aa=function(){};
var f=new fn;
fn();//this->window
obj.fn();//this->obj
fn.prototype.aa();//this->fn.prototype
f.aa();//this->f
f.__proto__.aa();//this->f.__proto__->fn.prototype
4、在構造函數模式中,函數體中的this.xxx=xxx中的this是當前類的一個實例
[案例1]
function Fn(){
this.x=100; //this->f
this.getX=function(){
console.log(this);//this->f 因為getX方法執行的時候,"."前面是f,所以this是f
}
}
var f=new Fn;
f.getX();
5、使用call/apply來改變this的指向(一但遇到call/apply上述的四條都沒用了)
[嚴格模式]
"use strict";//->告訴瀏覽器我們接下來編寫的JS代碼採用嚴格模式
1、自執行函數中的this永遠是undefined
[案例1]
var obj={
fn:(function(i){
//this->undefined
return function(){
//this->obj
}
})(0)
};
obj.fn();
3、方法執行,看方法名前面是否有".",有的話,"."前面是誰this就是誰,沒有的話this就是undefined
[案例1]
var obj={fn:fn};
function fn(){}
fn();//this->undefined
obj.fn();//this->obj
我們發現嚴格模式下的this相對於非嚴格模式下的this主要區別在於:對於JS代碼中沒有寫執行主體的情況下,非嚴格模式下預設都是window執行的,所以this指向的是window;但是在嚴格的模式下,沒有寫就是沒有執行主體,this指向的是undefined;