欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

js闭包中this的指向问题及三种解决方法

程序员文章站 2022-03-19 23:48:49
下面是一个问题,对象方法中定义的子函数,子函数执行时this指向哪里? 三个问题: (1)以下代码中打印的this是个什么对象? (2)这段代码能否实现使mynumber.v...

下面是一个问题,对象方法中定义的子函数,子函数执行时this指向哪里?
三个问题:
(1)以下代码中打印的this是个什么对象?
(2)这段代码能否实现使mynumber.value加1的功能?
(3)在不放弃helper函数的前提下,有哪些修改方法可以实现正确的功能?

var mynumber = {
  value: 1,
  add: function(i){
    var helper = function(i){
        console.log(this);
          this.value += i;
    }
    helper(i);
  }
}
mynumber.add(1);

1.this指向window对象(因为匿名函数的执行具有全局性,所以其this对象指向window);2.不能实现value加1(每个函数在被调用时都会自动取得两个特殊变量,this和arguments,内部函数在搜索这两个对象时,只会搜索到其活动对象为止,所以不能实现访问外部函数的this对象);
3.修改代码实现正确功能
第一种方法:

var mynumber={
    value:1,
    add:function(i){
        var that=this;//定义变量that用于保存上层函数的this对象
        var helper=function(i){
             console.log(that);
        that.value+=i;
    }
    helper(i);
    }
}
mynumber.add(1);

第二种方法:

var mynumber={
    value:1,
    add:function(i){
        var helper=function(i){
            this.value+=i;
        }
        helper.apply(this,[i]);//使用apply改变helper的this对象指向,使其指向mynumber对象
    }
}
mynumber.add(1);

第三种方法

var mynumber={
    value:1,
    add:function(i){
        var helper=function(i){
            this.value+=i;
        }.bind(this,i);//使用bind绑定,和apply相似,只是它返回的是对函数的引用,不会立即执行
        helper(i);
    }
}
mynumber.add(1);

?