首页
学习
活动
专区
工具
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指针的使用可以帮助我们更好地编写面向对象的程序。

26040

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

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

6.2K10
  • 让你写出更加优秀的代码!

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

    5.4K20

    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 语句可以实现在同⼀个函数 内跳转到设置好的标号处。

    13310

    【C语言基础篇】结构控制(下)转向语句break、continue、goto、return

    (但goto语句尽量少用,因为这不利于结构化程序设计,滥用它会使程序流程无规律、可读性差,稍后会在文章中介绍) 一、break语句 break 的作用是用于跳出switch结构或循环结构,只要...switch 语句中 break对于switch语句的作用不同于三种循环—— break在switch中属于是必不可少的选项。...语句后边的部分不再执行,直接进入下一次循 下面依然以打印1-10的数字为例,分别展示continue在三种循环中的使用和效果 1. continue在 while 循环中 #include 在满足某种条件时,使用continue跳过每次循环后面的代码,直接进入下一次循环 但continue在三种循环中的使用效果有所不同: 在while循环和do...while循环中,如果continue...四、return语句 在C语言中,return语句用于从函数中返回。 当程序执行到函数中的return语句时,函数的执行会立即结束,返回到调用该函数的地方。

    13110

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

    什么是异步,同步,阻塞,非阻塞 在写这篇文章前,我对这四个概念是非常模糊的。 同步,异步 异步同步的差异,在于当线程调用函数的时候,线程获取消息的方式....如果是同步,线程会等待接受函数的返回值(或者轮循函数结果,直到查出它的返回状态和返回值)。如果是异步,线程不需要做任何处理,在函数执行完毕后会推送通知或者调用回调函数。...线程在同步调用下,也能非阻塞(同步轮循非阻塞函数的状态),在异步下,也能阻塞(调用一个阻塞函数,然后在函数中调用回调,虽然没有什么意义)。 下面,我会慢慢实现一个异步非阻塞的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__.

    91020

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

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

    4.7K30

    关于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.7K10

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

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

    3.9K20

    如何用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

    使用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关键字实现了对块级作用域的支持。...那有的同学会说,这不是有块级作用域吗,那为什么又说没有块级作用域呢?我们又怎么区分有没有块级作用域呢?其实很简单,我们来看看代码就知道了。

    42910

    前端面试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

    第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(); // 类型关联函数调用 这些语法类似于面向对象语言中的静态方法:普通方法会在值上调用

    10210
    领券