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);
?
推荐阅读
-
JS中批量给元素绑定事件过程中的相关问题使用闭包解决
-
JS继承与闭包及JS实现继承的三种方式
-
js闭包中this的指向问题及三种解决方法
-
闭包的原理与经典应用场景,访问器属性,类与对象的创建与成员引用,数组与对象的解构过程与经典案例,JS引入到浏览器中的的方法及获取DOM元素的两个API
-
闭包的原理与经典应用场景,访问器属性,类与对象的创建与成员引用,数组与对象的解构过程与经典案例,JS引入到浏览器中的的方法及获取DOM元素的两个API
-
JS中批量给元素绑定事件过程中的相关问题使用闭包解决_jquery
-
IDEA中已配置阿里镜像但maven无法下载jar包的问题及解决方法
-
关于JS中闭包的问题
-
闭包及访问量属性和类与对象解构赋值以及js中对html中的dom操作(时间有点紧,没全理解透,需回头整理)
-
JS中批量给元素绑定事件过程中的相关问题使用闭包解决