首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么这不起作用?在循环中调用属于对象的函数

这个问题的答案可能与JavaScript中的this关键字有关。在JavaScript中,this关键字的值取决于函数的调用上下文。在循环中调用对象的函数时,this可能不是您所期望的对象。

以下是一个可能的解决方案:

代码语言:javascript
复制
const obj = {
  value: 1,
  func: function() {
    console.log(this.value);
  }
};

// 使用bind方法将函数的上下文绑定到obj对象
for (let i = 0; i < 5; i++) {
  setTimeout(obj.func.bind(obj), 1000);
}

在这个例子中,我们使用bind方法将obj.func的上下文绑定到obj对象。这样,在循环中调用obj.func时,this将始终指向obj对象。

另一种解决方案是使用箭头函数,箭头函数没有自己的this值,它会捕获其所在上下文的this值。因此,可以将obj.func改为箭头函数:

代码语言:javascript
复制
const obj = {
  value: 1,
  func: () => {
    console.log(this.value);
  }
};

// 使用箭头函数,this将指向obj对象
for (let i = 0; i < 5; i++) {
  setTimeout(obj.func, 1000);
}

在这个例子中,我们将obj.func改为箭头函数。由于箭头函数没有自己的this值,它会捕获其所在上下文的this值,因此this将始终指向obj对象。

希望这些解决方案能够帮助您解决问题。如果您需要更多的帮助,请随时告诉我。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++ this指针:用于成员函数中指向调用函数对象

C++中this指针是一个指向当前对象指针。成员函数中,可以使用this指针来访问调用函数对象成员变量和成员函数。...函数内部,返回是指向调用函数对象指针。...这里使用了*this来访问调用函数对象。 三、作为函数参数this指针 this指针也可以作为函数参数传递。这种情况下,可以函数内部访问其他对象成员变量和成员函数。...getName函数内部,使用了this指针访问调用函数对象成员变量name。...四、总结 this指针C++中是一个非常重要概念,可以用来访问调用函数对象,作为返回值返回,或者作为函数参数传递。掌握this指针使用可以帮助我们更好地编写面向对象程序。

24840

创建子类对象时,父类构造函数调用被子类重写方法为什么调用是子类方法?

public static void main(String[] args) { A a = new A(); B b = new B(); } } 问题:为什么创建...A对象时候父类会调用子类方法?...但是:创建B对象父类会调用父类方法? 答案: 当子类被加载到内存方法区后,会继续加载父类到内存中。...当子类对象创建时,会先行调用父类构造方法(构造方法也是方法),虚拟机会在子类方法区寻找该方法并运行。 但是:由于java语言是静态多分派,动态单分派。...其结果是当编译时候,父类构造方法调用方法参数已经强制转换为符合父类方法参数了。 上边代码在编译前已经转换为下面这个样子了。

6.2K10
  • C语言中循环语句总结

    while坏:  for循环:  while和for循环对比: 区别:for 和 while 实现循环过程中都有初始化、判断、调整这三个部分,但是 for 循环三个部 分⾮常集中,便于代码维护...环中 continue 后代码,直接去到循环调整部分。...,来到了i++调整部分 printf("%d ", i); } return 0; } 运行结果: 对比for循环和while循环中continue对代码运行影响: 分析代码可以知道它们修改条件位置不同...对于while循环修改条件continue后面所以当i=5时,他没法继续修改,而是陷入i=5死循环  对于for循环修改条件continue上面,所以当i=5时,它会跳出printf函数来到上面进行条件修改...,i=5这个基础上进行i++ do while语句中break和continue作用跟while一样: goto语句 作用:goto 语句可以实现在同⼀个函数 内跳转到设置好标号处。

    12710

    让你写出更加优秀代码!

    贾言 代码评审歪诗 窗外风雪再大 也有我陪伴着你 全文字数:2000字 阅读时间:5分钟 贾言 代码评审歪诗 验幻空越重 命频异长 依轮线日简 接偶正分壮 架构师说, 用20个字描述代码评审内容...验-言 公共方法都要做参数校验,参数校验不通过明确抛出异常或对应响应码: Java Bean验证已经是一个很古老技术了, 会避免我们很多问题; 接口中也明确使用验证注解修饰参数和返回值, 作为一种协议要求调用方按验证注解约束传参...命-明 包/类/方法/字段/变量/常量命名要遵循规范,要名副其实,这不但可以增加可读性,还可以起名过程中引导我们思考方法/变量/类职责是否合适 有意义很重要, 典型无意义命名: ?...-勋 不要在循环中调用服务,不要在循环中做数据库等跨网络操作; 频-品 写每一个方法时都要知道这个方法调用频率,一天多少,一分多少,一秒多少,峰值可能达到多少,调用频率高一定要考虑性能指标,考虑是否会打垮数据库...接-洁 接口是用来隔离变化,如果一个业务有几种不同形态,但都有相同处理,那么可以定义接口来隔离业务形态不同,服务调用处,通过业务类型字段来获得不同服务类。

    5.4K20

    异步,同步,阻塞,非阻塞程序实现

    什么是异步,同步,阻塞,非阻塞 写这篇文章前,我对这四个概念是非常模糊。 同步,异步 异步同步差异,在于当线程调用函数时候,线程获取消息方式....如果是同步,线程会等待接受函数返回值(或者轮函数结果,直到查出它返回状态和返回值)。如果是异步,线程不需要做任何处理,函数执行完毕后会推送通知或者调用回调函数。...线程同步调用下,也能非阻塞(同步轮非阻塞函数状态),异步下,也能阻塞(调用一个阻塞函数,然后函数调用回调,虽然没有什么意义)。 下面,我会慢慢实现一个异步非阻塞sleep。...上面的代码中,一个while循环中timer状态。由于timer存在于wait中。所以需要把timer“提取”出来。...由于my_sleep新线程中执行,所以它不会阻塞住主线程。 my_sleep结束时,调用回调函数。使得任务继续进行。 也就是说,每个要处理阻塞地方,都人为函数切成三个部分: 1.

    7.6K10

    图解 JavaScript 原型与原型链

    原型平时工作中用得比较少, 但原型是 JavaScript 中基础, 是构建大型应用, 框架不可或缺一环, 是你写代码时, 不知不觉就应用上了一个最基础知识....上图左边代表 Foo 函数, 它有一个 prototype 属性, 指向右侧这个原型对象, 每声明一个函数, 都会有这样一个原型对象, 原型对象有一个 constructor 属性, 指向 Foo 函数本身...我们 new 出 foo 对象后, 并没有给 foo 对象添加任何方法, 但我们依然能从 foo 对象调用 toString(), hasOwnProperty() 等方法. 这是为什么呢?..., __proto__ 就是用来查找属性和方法, 从上图链条来看, 我们 foo 这个对象中, 查找 toString 方法, 没找到, 就着 foo....__proto__ 里也没有找到, 就着 foo.__proto__.__proto__ 找, 诶这个时候找到了, 则调用, 如果还找不到, 就再往上找, 即 foo.__proto__.

    90520

    关于Python循环,看这一篇就够了

    ()函数介绍 Python中range()函数返回是一个整数序列对象,一般用在 for 循环中。...函数语法 range(start, stop,[step]) 参数说明:start: 计数从start开始。默认是从 0 开始。end: 计数到end结束,但不包括 end。...break作用:循环体内遇到break则会跳出循环,终止循环,不再执行下面的语句。...break/continue只能用在循环中,不能单独使用 break/continue嵌套循环中,只对最近一层循环起作用 分别使用break和continue运行下面代码,体会两者区别。...代码') 两者区别 while基于条件判断循环,for循环基于容器循环,所以需要根据具体场景进行选取,比如属于条件约束,使用while循环,有明确迭代对象(序列)则使用for循环。

    1.6K10

    京东资深架构师代码评审歪诗

    在此之前和讯网负责股票基金行情系统研发工作,具备高并发、高可用互联网应用研发经验。 贾言验幻空越重, 命频异长。 依轮线日简, 接偶正分壮。言欢空月虫, 明勋品宜昌。..., 作为一种协议要求调用方按验证注解约束传参, 返回值验证注解约束提供方按注解要求返回参数 幻: 代码中要杜绝幻数,幻数可定义为枚举或常量以增强其可读性 空: 要时刻警惕空指针异常 常见 a.equals...- 明勋品宜昌 命: 包 / 类 / 方法 / 字段 / 变量 / 常量命名要遵循规范,要名副其实, 这不但可以增加可读性,还可以起名过程中引导我们思考方法 / 变量 / 类职责是否合适...: 不要在循环中调用服务,不要在循环中做数据库等跨网络操作 频: 写每一个方法时都要知道这个方法调用频率,一天多少,一分多少,一秒多少,峰值可能达到多少,调用频率高一定要考虑性能指标,...接偶正分壮 - 洁偶正粉妆 接: 接口是用来隔离变化,如果一个业务有几种不同形态,但都有相同处理,那么可以定义接口来隔离业务形态不同,服务调用处,通过业务类型字段来获得不同服务类。

    4.7K30

    超全 | 只有高手才知道C语言高效编程与代码优化方法(二)

    =0; i--){} 这里我们需要记住是循环必须终止于0(因此,如果在50到80之间循环,这不起作用),并且循环计数器是递减。 使用递增循环计数器代码不享有这种优化。...如果在循环中一个函数经常被调用,那么就将循环纳入到函数中,这样可以减少重复函数调用。...以下应用中,近一半函数调用调用叶子函数。 由于不需要执行寄存器变量存储和读取,叶子函数在任何平台都很高效。...内联函数 内联函数禁用所有的编译选项。 使用__inline修饰函数导致函数调用处直接替换为函数体。 这样代码调用函数更快,但增加代码大小,特别在函数本身比较大而且经常调用情况下。...递归可能优雅而简单,但需要太多函数调用; 不在循环中使用sqrt开平方函数,计算平方根非常消耗性能; 一维数组比多维数组更快; 编译器可以一个文件中进行优化-避免将相关函数拆分到不同文件中

    3.8K20

    前端面试2021-003

    ABD A、类型中构造函数,用来创建对象同时初始化对象属性 B、创建指定类型对象时,会自动调用执行 C、类型中构造函数,需要手工调用执行 D、类型中普通函数,需要手工调用执行 答案:...ABD C问题:构造函数是创建对象时候自动执行,不需要手工调用 4、箭头函数使用,操作语法正确是?...ABD A、类表示类型意思 B、对象是包含数据、实际存在物体 C、一个类型只能创建一个对象 D、多个对象可以属于一个类型 ABD C问题:一个类型可以创建多个互相独立对象 8、ES6...BC A、静态属性是声明类型内部、类型方法外部、使用let声明变量 B、静态属性是声明类型内部、类型方法外部、使用static声明变量 C、静态属性是属于类型属性,所以只能被类型名称调用...D、静态属性是属于类型属性,所以可以被类型名称和该类型创建所有对象调用 BC 9、关于函数中使用默认值,操作方式正确是?

    89530

    使用letconst定义变量场景

    为什么使用Let,const定义变量更节省内存?...f无论如何变量tmp都会被创建,预编译阶段,javaScript引擎会将上面的f函数修改成下面这样 函数f执行后,输出结果为undefined,原因就是在于,当使用函数声明时,变量会提升到运行坏境顶部...命令声明变量tmp之前,都属于变量tmp死区 之所以定义暂时性死区,和不存在变量提升,主要是为了减少运行时错误,防止变量声明之前就使用这个变量,从而导致一些Bug 暂时性死区本质是: 只要一进入当前作用域...(浏览器环境中window对象),使用var会覆盖一个已经存在全局变量 let,const和class命令声明全局变量不属于全局对象属性,声明变量不会提升,而且只可以声明这些变量代码块中使用...使用const定义初始化值变量,那么就会报错,因为常量不能被改变 而for..in,fo..of循环中,let,const都会每次迭代创建一个新绑定,从而使循环体内创建函数可以访问到相应迭代值,而非最后一次迭代后

    1K20

    【入门级】从一道面试题了解js作用域及作用域链

    全局作用域 全局作用域就是代码运行时最外围执行环境,比如在我国,最大范围就是全国,全国就是全局作用域,而在js中,全局作用域被认为是window对象,而在上一篇文章中我们也说到了,全局作用域中声明变量为全局变量...作用域嵌套与作用域链 上面我们说了,声明一个函数同时就会创建属于函数作用域,那么函数可能会存在嵌套情况,这时候就产生了作用域嵌套,这时候我们执行代码的话,就会产生一个作用域链,作用域链前端,始终都是当前执行代码距离最近作用域...另外要说一点,我们讲this那一篇文章中说了,this是函数调用时决定函数被定义时并没有this。而作用域则刚好相反,作用域是函数定义时决定,跟函数在哪里被调用没有关系。...所以无论我们在哪里调用函数,都不会改变他作用域链。 块作用域 上面我们说了,es6之前,js中是没有块作用域es6中,添加了let关键字实现了对块级作用域支持。...那有的同学会说,这不是有块级作用域吗,那为什么又说没有块级作用域呢?我们又怎么区分有没有块级作用域呢?其实很简单,我们来看看代码就知道了。

    41710

    如何用Python过一个完美的七夕节?

    ,下面就开始烟花燃放模拟循环过程:通过递归不断背景中产生新烟花。...首先定义一个 simulate 模拟函数函数中定了一些参数: t:时间戳; explode_points:烟花爆炸点列表,供后续更新使用; num_explore:随机烟花数量; 然后在所有的烟花数量中循环创建所有的烟花颗粒类...,当然每次循环中颗粒类都需要设置一定属性参数,参数多是随机产生: objects:存放所有的颗粒对象; x_cordi,y_cordi:随机产生烟花在背景中x,y坐标位置(50,550); speed...; photo:使用ImageTk定义了Tkinter中图像对象; 然后将在画布对象上创建一个图像(使用定义photo对象作为参数),最后调用Tkinter对象root进行持续不断地simulate...,还不赶紧定制一个属于自己烟花秀?

    2.9K10

    第6章 | 循环控制流,return,loop,函数,字段,运算符,类型转换,闭包

    6.6 循环中控制流 break 表达式会退出所在循环。( Rust 中,break 只能用在循环中,不能用在 match 表达式中,这与 switch 语句不同。)... for 循环中,continue 会前进到集合中下一个值,如果没有更多值,则退出循环。...6.8 为什么 Rust 中会有 loop Rust 编译器中有几个部分会分析程序中控制流。 Rust 会检查通过函数每条路径是否返回了预期返回类型值。...所以, Rust 中,这些表达式没有正常类型。不能正常结束表达式属于一个特殊类型 !,并且它们不受“类型必须匹配”这条规则约束。...第三种语法用于调用类型关联函数,比如 Vec::new(): let mut numbers = Vec::new(); // 类型关联函数调用 这些语法类似于面向对象语言中静态方法:普通方法会在值上调用

    8810
    领券