天天看点

this的基本用法和改变this指向问题

1:全局中的this

this->window.例如

this的基本用法和改变this指向问题

2:在全局作用域中声明一个变量,等同于在window上添加一个属性

  1. 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指向该对象

  1. 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对象.

  1. .<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;

  1. setInterval(function(){

    console.log(this)//相当于把函数传递进来后直接执行了,所以this->window },1000),

5: 如何改变this的指向.

1:call(x,…)

  1. 第一个参数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)

  1. 第一个参数x为this的指向,y为传入参数的集合,用法和call一样,唯一的区别是call传入实参是一个一个传递,而apply传入的实参是一个集合.
  2. 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

this的基本用法和改变this指向问题

3:bind(a,b)

和call用法一样,不会执行函数,会返回一个改变this以后的函数

this的基本用法和改变this指向问题