1:全局中的this
this->window.例如
2:在全局作用域中声明一个变量,等同于在window上添加一个属性
- var obj={}; console.log(this.obj); //{}
this->.obj通过this指向获取window上挂载的属性 console.log(window.obj==obj)
//true
3:函数中的this只和函数的调用方式有关,和声明方式无关
1:函数如果直接调用,函数中的this指向window
.例如:var name='zhangsan';
function fn(){
var name='lisi'
console.log(this.name)}
fn() //输出结果是zhangsan
2:如果函数被一个对象调用,那么this指向该对象
- var name=‘zhangsan’;
var obj={
name:‘lisi’,
fn:function(){
name=‘wangwu’
console.log(this.name) }
}
obj.fn() //李四
var name=‘张三’;
function getname(){
console.log(this.name) }
var obj={
name:‘李四’,
fn:function(){
console.log(this.name)
},
lastfn:{
name:’‘王五’’,
fn:getname
} }
var getAge=obj.fn;
getname() //函数直接调用,this指向window,所以输出’张三’
obj.fn()//函数是被obj对象调用,this指向obj,所以输出’李四’
obj.lastfn.fn() //
当前函数调用的是obj.lastfn,this指向obj.lastfn,所以输出结果是’王五’
getAge()//函数是直接调用的,this指向window,内部函数如果有this都是指向window,所以输出’张三’.
4:this的特殊情况
. 1:事件处理程序中,this指向当前绑定的dom对象.
-
.<div id=“click”">
click.οnclick=function(){ //click.onclick()click.οnclick=function(){ //click.onclick()
console.log(this) //输出节点div
}click.addEventListener(‘click’,function(){ console.log(this) //当中的function也是事件处理程序,所以当中的this也指向当前绑定的dom元素 },false)
2:定时器,延时器;this->window;
- setInterval(function(){
console.log(this)//相当于把函数传递进来后直接执行了,所以this->window },1000),
5: 如何改变this的指向.
1:call(x,…)
- 第一个参数x为this的指向,后续参数为选填,为函数传入的实参.
var name=‘张三’;
var obj={
name:‘李四’
};
function fn(a,b){
console.log(this.name);
console.log(a+b);
};
fn(); //输出张三
fn.call(obj); //输出’李四’,NaN fn.call(obj); //输出’李四’,NaN
fn.call(obj,10,10) //输出’李四’,20
2:apply(x,y)
- 第一个参数x为this的指向,y为传入参数的集合,用法和call一样,唯一的区别是call传入实参是一个一个传递,而apply传入的实参是一个集合.
- var name=‘张三’;
var obj={
name:‘李四’
};
function fn(a,b){
console.log(this.name);
console.log(a+b);
};
fn(); //输出张三
fn.apply(obj); //输出’李四’,NaN
fn.apply(obj,[10,10]) //输出’李四’,20
3:bind(a,b)
和call用法一样,不会执行函数,会返回一个改变this以后的函数