1.this只指向上一级的对象(上一级的对象主要看执行语句决定),如果没有上级对象,就是window对象
- 没有上级对象,就是window对象
var name = "kakaka";
var sayName = function(){
alert(this.name);
}
sayName();//没有上一级,所以是window,返回kakaka
- 指向上一级的对象, 如果上一级没有该属性,那就显示undefined
var name = "kakaka";
var object = {
name: "lalala",
typename: function(){
alert(this.name);
}
}
object.typename();//上一级是object,所以返回的是lalala
- 指向上一级的对象, 而不会指向上上级
var name="kakaka";
var object={
name:"lalala",
type:{
name:"ninini",
typename:function(){
alert(this.name);
}
}
}
object.type.typename();//上一级是type,所以返回的是ninini
- 指向上一级的对象,赋值给一个变量,那么就参考这个变量的上一级
var name = "kakaka";
var object = {
name:"lalala",
type:{
name:"ninini",
typename:function(){
alert(this.name);
}
}
}
var j = object.type.typename; //赋值给新对象
j(); //没有上一级,所以是window,返回kakaka
2.new可以改变this的指向,因为new创建了一个实例对象,this就指向那个对象
var obj=function(){
this.name="lalala";
}
var j=new obj();
j.name = 'sddsd';
alert(j.name);//返回sddsd
3.当this碰到return时,return返回值是一个对象的话,this就指向那个返回的对象
var obj=function(){
this.name="lalala";
return {};//返回值是一个对象
}
var j=new obj();
alert(j.name);//this指的是返回的那个对象,所以为undefined
var obj=function(){
this.name="lalala";
return {name:'zjf'};//返回值是一个对象
}
var j=new obj();
alert(j.name);//this指的是返回的那个对象,所以为zjf
4.如果返回值不是一个对象那个的话,this还是指向函数的实例(null特殊:虽然是一个对象,但是this也指向函数实例)
var obj=function(){
this.name="lalala";
return undefined;//返回的值不是一个对象那个的话
}
var j=new obj();
alert(j.name);//this指向的还是原来的函数的实例,显示lalala
var obj=function(){
this.name="lalala";
return 'zjf';//返回的值不是一个对象那个的话
}
var j=new obj();
alert(j.name);//this指向的还是原来的函数的实例,显示lalala
5.setTimeOut的this指向在非严格模式下,是指向window,在严格模式下,是undefined
var a = 0;
var object = {
test: function() {
a: 1,
setTimeout(function() {
console.log(this.a);
}, 10);
}
};
object.test(); // 0
var a = 0;
var object = {
a: 1,
test: function() {
console.log(this.a);
}
};
object.test(); // 1
6.箭头函数中的this指向,一般作为普通函数都指向调用它的对象,但是如果是作为方法,那么就指向window
var obj = {
a: 1,
b: function () {
var m = (() => {return this})();
return m;
}
}
console.log(obj.b()); //{a: 1, b: ƒ}
var obj = {
a: 1,
b: () => { return this; }
};
console.log(obj.b());
7.赋值后,由于赋值表达式的值是函数本身,所以this不能维持
var name = "window"
var object = {
name: "object",
getName: function() {
return this.name;
}
}
console.log((object.getName=object.getName)()) // window