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

在setTimeout中调用的递归函数即使在导航到其他Angular组件之后也会执行

。setTimeout是JavaScript中的一个函数,用于在指定的时间后执行一段代码。递归函数是指在函数内部调用自身的函数。

在Angular中,当导航到其他组件时,Angular会销毁当前组件的视图和组件实例。但是,setTimeout中的递归函数不受Angular导航的影响,它会继续执行直到递归结束或达到某个终止条件。

这是因为setTimeout是浏览器提供的一个API,它与Angular的组件生命周期无关。即使组件被销毁,setTimeout中的递归函数仍然存在于浏览器的任务队列中,直到它被执行完毕。

需要注意的是,当组件被销毁时,如果setTimeout中的递归函数引用了组件的属性或方法,可能会导致内存泄漏或其他意外行为。为了避免这种情况,可以在组件销毁时取消定时器,可以使用Angular提供的OnDestroy生命周期钩子函数来实现。

总结起来,setTimeout中调用的递归函数会在导航到其他Angular组件之后继续执行,因为setTimeout是浏览器提供的API,与Angular的组件生命周期无关。但需要注意避免可能的内存泄漏问题。

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

相关·内容

再谈angularJS数据绑定机制及背后原理—angularJS常见问题总结

假设你一个ng-click指令对应handler函数更改了scope一条数据,此时AngularJS自动地通过调用$digest()来触发一轮$digest循环。...$apply 是 $scope(或者是 direcvie 里 link 函数 scope)一个函数调用它会强制一次 $digest 循环(除非当前正在执行循环,这种情况下抛出一个异常,这是我们不需要在那里执行...1) 最直接差异是, $apply 可以带参数,它可以接受一个函数,然后应用数据之后调用这个函数。...不过, AngularJS 应该尽量使用 $timeout Service 来代替 setTimeout(),因为前者帮你调用 $apply(),让你不需要手动地调用它。...所以说不要怀疑用户输入表单时 angular 会不会监听页面左边导航变化。 如何优化脏检查与运行效率 脏检查慢吗? 说实话脏检查效率是不高,但是谈不上有多慢。简单数字或字符串比较能有多慢呢?

7.8K40

社招前端一面react面试题汇总

(构造函数)调用 super(props) 目的是什么 super() 被调用之前,子类是不能使用 this ES2015 ,子类必须在 constructor 调用 super()...调用 setState 时,组件 state 并不会立即改变, setState 只是把要修改 state 放入一个队列, React 优化真正执行时机,并出于性能原因,会将 React 事件处理程序多次...,即使传入子组件 props 未发生变化,那么子组件重新渲染,进而触发 render(2)重新渲染 render 会做些什么?...执行,遵守先清理后更新) // 以及 componentWillUnmount 执行内容 } // 当函数 Cleanup 函数按照在代码定义顺序先后执行,与函数本身特性无关...Ajax请求应该写在组件创建期第五个阶段,即 componentDidMount生命周期方法。原因如下。创建期其他阶段,组件尚未渲染完成。

3K20
  • 2021Vue.js面试题汇总及答案【全网最全 建议收藏】「建议收藏」

    每个组件实例都有相应watcher程序实例,它会在组件渲染过程把属性记录为依赖,之后当依赖项setter被调用时,会通知watcher重新计算,从而致使它关联组件得以更新。...="message" @input=" 1.15.data为什么是一个函数而不是对象 JavaScript对象是引用类型数据,当多个实例引用同一个对象时,只要一个实例对这个对象进行操作,其他实例数据会发生变化...和 Promise.then 异步更新队列 可能你还没有注意,Vue 更新 DOM 时是异步执行。...updated发生在更新完成之后,当前阶段组件Dom已完成更新。要注意是避免在此期间更改数据,因为这可能导致无限循环更新。...destroyed发生在实例销毁之后,这个时候只剩下了dom空壳。组件已被拆解,数据绑定被卸除,监听被移出,子实例统统被销毁。

    8.7K30

    2、Angular JS 学习笔记 – 双向数据绑定和Scope概念

    这里演示了作用域中绑定html input 组件属性自动更新。 渲染{{greeting}}逻辑包括: 获取与模板上{{greeting}}相关作用域。...这个延迟是必要,因为它收集多个模型更新到一次watch通知,保证watch通知时没有其他watch已经在运行。...你可以使用apply()javascript中进入Angular执行上下文,请记住在大多数地方(controllers,services) apply 已经被指令调用用来处理时间。...一个显式调用只有实现自定义事件调用使用,或在工作第三方回调。 进入Angular执行上下文通过调用scope....这通常使用setTimeout(0)实现,但是setTimeout(0)方式慢,并且因为浏览器渲染页面时事件执行之后,所以可能视图还会闪烁。

    13.2K20

    1000个项目中前10名JavaScript错误介绍

    如果我们只查看每个错误发生总次数,那么客户量大项目产生错误可能压倒其他错误,导致实际收集是与大多数读者无关错误数据集。...我们来看一个真实应用程序中发生例子:我们选择 React,但该情况同样适用于 Angular、Vue 或任何其他框架。...当异步获取数据时,不管它是构造函数componentWillMount还是componentDidMount获取组件在数据加载之前至少呈现一次,当 Quiz 第一次呈现时,this.state.items...Uncaught RangeError: Maximum call stack 这是 Chrome 一些情况下会发生错误。 一个是当你调用一个不终止递归函数。...这意味着即使函数外有名为 testArray 变量,一个函数具有相同名字参数会被视为本地参数。 您有两种方法可以解决您问题: 1.

    6.2K10

    10 种最常见 Javascript 错误

    我们来看一个真实应用程序中发生例子:我们选择 React,但该情况同样适用于 Angular、Vue 或任何其他框架。...当异步获取数据时,不管它是构造函数componentWillMount还是componentDidMount获取组件在数据加载之前至少呈现一次,当 Quiz 第一次呈现时,this.state.items...任何执行和处理 DOM 元素 JS 代码都应该在创建 DOM 元素之后执行。 JS 代码按照 HTML 规定从上到下进行解释。...Uncaught RangeError: Maximum call stack 这是 Chrome 一些情况下会发生错误。 一个是当你调用一个不终止递归函数。...这意味着即使函数外有名为 testArray 变量,一个函数具有相同名字参数会被视为本地参数。 您有两种方法可以解决您问题: 1.

    6.8K80

    手写防抖函数 debounce 和节流函数 throttle

    所以,如果 debounce 内部直接以 fn() 方式调用函数导致原函数内部 this 指向发生变化。...如果原函数本来挂载某对象上,新生成函数需要挂载到那对象上,因为 debounce 内部 fn.call(this) 时,这个 this 是指返回函数调用 this。...ts + angular 版 我还想讲讲我实际项目中所进行防抖处理,上面的 js 版每篇防抖文章,基本都是那样实现,都是封装一个高阶函数。...* 入口接收两个参数: * component:当前组件类,使用时必须挂载某个组件上,组件销户时,如果有轮询任务,会去进行释放定时器 * tag:可选参数,用于标识不同任务,相同 tag,多次调用都会被视为同个任务进行防抖处理...,增加了对任务标识处理,这样一来,即使忘记清理,内部可以组件销毁时自动去清理,即使多次调用,只要任务标识不一样,内部就会进行防抖处理。

    3K20

    实战 | Change Detection And Batch Update

    到此我们可以得出这样一个结论: React调用方法连续setState走是批量更新,此外走是连续更新 说到这里,有些人可能会有这样一个疑惑: setTimeout也是handleClick...setTimeout确实是handleClick当中调用,但是两个setState可不是handleClick当中调用,它们是传递给setTimeout参数——匿名函数执行,走是事件轮询...看个例子: 执行这段代码,打开控制台会发现打印如下 事务最主要功能就是可以Wrapper一个函数,通过perform调用执行这个函数之前调用initialize方法,等这个函数执行结束了调用...小结 Angular1我们是直接操作数据,这个过程Angular1是感知不到,只能在某个点调用$apply进行脏值检测,所以默认就是批量更新。...但是对于异步方法,例如: 我们无法知道foo是什么时候开始执行和结束,因为它是异步。如果调用改成这样: 通过添加一层wrapper函数,不就可以保证foo执行调用baz了么。

    3.2K20

    Change Detection And Batch Update

    到此我们可以得出这样一个结论: React调用方法连续setState走是批量更新,此外走是连续更新 说到这里,有些人可能会有这样一个疑惑 handleClick() { setTimeout...setTimeout确实是handleClick当中调用,但是两个setState可不是handleClick当中调用,它们是传递给setTimeout参数——匿名函数执行,走是事件轮询...综上,说setState是异步需要加一个前提条件,React调用方法执行,这时我们需要通过回调获取到最新state this.setState({val: 1}, () => { console.log...,打开控制台会发现打印如下 事务最主要功能就是可以Wrapper一个函数,通过perform调用执行这个函数之前调用initialize方法,等这个函数执行结束了调用close方法。...$apply(); }); 小结 Angular1我们是直接操作数据,这个过程Angular1是感知不到,只能在某个点调用$apply进行脏值检测,所以默认就是批量更新。

    3.3K40

    Change Detection And Batch Update

    到此我们可以得出这样一个结论: React调用方法连续setState走是批量更新,此外走是连续更新 说到这里,有些人可能会有这样一个疑惑 handleClick() { setTimeout...setTimeout确实是handleClick当中调用,但是两个setState可不是handleClick当中调用,它们是传递给setTimeout参数——匿名函数执行,走是事件轮询...综上,说setState是异步需要加一个前提条件,React调用方法执行,这时我们需要通过回调获取到最新state this.setState({val: 1}, () => { console.log...,打开控制台会发现打印如下 事务最主要功能就是可以Wrapper一个函数,通过perform调用执行这个函数之前调用initialize方法,等这个函数执行结束了调用close方法。...$apply(); }); 小结 Angular1我们是直接操作数据,这个过程Angular1是感知不到,只能在某个点调用$apply进行脏值检测,所以默认就是批量更新。

    3.7K70

    vue那些原理题?(面试版)

    setTimeout(flushCallbacks, 0); };}环境判断结束就会得到一个延迟回调函数timerFunc 然后进入核心 nextTick2 nextTick()函数源码 使用时候就是调用...fn.bind(this) : fn) : p;}简单来看就是一个 PromisenextTick 接受一个函数为参数,同时会创建一个微任务,我们页面调用 nextTick 时候,执行函数,把我们参数...这种单页面应用 就是这样规则.路由守卫全局路由守卫前置路由守卫: beforeEach 路由切换之前被调用全局解析守卫:beforeResolve 每次导航时就会触发,但是确保导航被确认之前,同时在所有组件内守卫和异步路由组件被解析之后...路由配置里调用 beforeEnter。解析异步路由组件。在被激活组件调用 beforeRouteEnter。调用全局 beforeResolve 守卫(2.5+)。导航被确认。...调用全局 afterEach 钩子。触发 DOM 更新。调用 beforeRouteEnter 守卫传给 next 回调函数,创建好组件实例会作为回调函数参数传入。

    62420

    Angular快速学习笔记(2) -- 架构

    但是,任何模块都能包含任意数量其它组件,这些组件可以通过路由器加载,可以通过模板创建。那些属于这个 NgModule 组件共享同一个编译上下文环境。 ?...Angular 每个 JavaScript 事件循环中处理所有的数据绑定,它会从组件根部开始,递归处理全部子组件。 ?...该装饰器提供元数据可以让你服务作为依赖被注入客户组件。 服务是一个广义概念,它包括应用所需任何值、函数或特性。狭义服务是一个明确定义了用途类。它应该做一些具体事,并做好。...如何使用: Angular ,要把一个类定义为服务,就要用 @Injectable 装饰器来提供元数据,以便让 Angular 可以把它作为依赖注入组件 使用 @Injectable 装饰器来表明一个组件或其它类...它工作模型基于人们熟知浏览器导航约定: 地址栏输入 URL,浏览器就会导航相应页面 页面中点击链接,浏览器就会导航一个新页面 点击浏览器前进和后退按钮,浏览器就会在你浏览历史向前或向后导航

    5.3K20

    AngularJSdigest循环和$apply

    结果查阅资料,终于得知,使用第三方框架(比如jQuery),或者调用setTimeout(),导致其运行在AngularJS上下文外部,可以使用apply()函数Angular返回apply()函数让...循环之前,触发该值(ng-model)上运行验证和格式化操作; (5)由于digest循环中值发生了变化,angular需要再次运行这一循环以确定它没有改变作用域对象上其他值。...apply()函数可以从angular框架外部让表达式angular上下文内部执行。...当手动处理事件,使用第三框架(比如jquery)或者调用setTimeout都可以使用apply()函数可以从angular框架外部让表达式angular上下文内部执行。...当手动处理事件,使用第三框架(比如jquery)或者调用setTimeout都可以使用apply()函数将值传递angular应用

    3.2K41

    前端面试题库系列(4)

    双向数据绑定与vue数据双向数据绑定 二者都是 MVVM 模式开发典型代表 angular 是通过脏检测实现,angular 会将 UI 事件,请求事件,settimeout 这类延迟,对象放入事件监测脏队列...解析文件递归过程根据文件类型和loader配置找出合适loader用来对文件进行转换。 递归完后得到每个文件最终结果,根据entry配置生成代码块chunk。...macrotask 执行之后执行 递归调用process.nextTick()导致I/O starving,官方推荐使用setImmediate() 浅拷贝和深拷贝问题 深拷贝和浅拷贝是只针对...双向数据绑定与vue数据双向数据绑定 二者都是 MVVM 模式开发典型代表 angular 是通过脏检测实现,angular 会将 UI 事件,请求事件,settimeout 这类延迟,对象放入事件监测脏队列...macrotask 执行之后执行 递归调用process.nextTick()导致I/O starving,官方推荐使用setImmediate() 浅拷贝和深拷贝问题 深拷贝和浅拷贝是只针对

    1.3K10

    AngularJS 1 教程

    ,而相应view(表单)变化了,自动同步model。...这一步已经可以开始写一定Angualr应用了,按照一定功能粒度划分模块,然后纯粹js业务代码,之后数据绑定view。 实际上之后Angular 1种种概念都是围绕上述展开和补充。...脏检查字面理解就是循环对比前后值,如果不相同说明就是“脏”然后执行相应操作,直到所有值相同,或者超出循环次数范围 如果说scope是入门核心,那么Angualr脏检查就是入门精通核心。...link 函数,如果需要接触DOM,代码在此函数。 controller 函数,一般用作指令间调用。...扩展来说, **今天主流组件潮流之下,Angular 1完全可以依赖directive来按照component-based方式书写框架,**甚至这点已经是目前Angualr 1社区潮流用法:Component-Based

    4.6K30

    Angular开发实践(五):深入解析变化监测

    什么是变化监测 使用 Angular 进行开发,我们常用到 Angular 绑定——模型视图输入绑定、视图模型输出绑定以及视图与模型双向绑定。...简单来说,变化监测就是 Angular 用来监测视图与模型之间绑定值是否发生了改变,当监测到模型绑定值发生改变时,则同步视图上,反之,当监测到视图上绑定值发生改变时,则回调对应绑定函数。...变化监测源头 变化监测关键在于如何最小粒度地监测到绑定值是否发生了改变,那么什么情况下导致这些绑定值发生变化呢?...变化监测处理机制 通过上面的介绍,我们大致明白了变化检测是如何被触发,那么 Angular 变化监测是如何执行呢?...reattach():把分离变化监测器重新安装上,使得该组件及其子组件都能执行变化监测。 detectChanges():手动触发执行组件各个子组件一次变化监测。

    1.8K80

    【面试题解】vue-router有几种钩子函数?具体是什么及执行流程是怎样

    from: Route: 当前导航正要离开路由对象 next: Function: 一定要调用该方法不然阻塞路由。...,其他钩子函数就不进行演示了。...beforeResolve 全局解析守卫,路由跳转前,所有 组件内守卫 和 异步路由组件 被解析之后触发,它同样 每次导航 时都会触发。...总结 完整导航解析流程 导航被触发。 失活组件调用 beforeRouteLeave 守卫。 调用全局 beforeEach 守卫。...调用 beforeRouteEnter 守卫传给 next 回调函数,创建好组件实例会作为回调函数参数传入。 上面是官方给出答案,现在我们用流程图来直观展示一下。

    77710

    vue这些原理你都知道吗?(面试版)

    setTimeout(flushCallbacks, 0); };}环境判断结束就会得到一个延迟回调函数timerFunc 然后进入核心 nextTick2 nextTick()函数源码 使用时候就是调用...fn.bind(this) : fn) : p;}简单来看就是一个 PromisenextTick 接受一个函数为参数,同时会创建一个微任务,我们页面调用 nextTick 时候,执行函数,把我们参数...这种单页面应用 就是这样规则.路由守卫全局路由守卫前置路由守卫: beforeEach 路由切换之前被调用全局解析守卫:beforeResolve 每次导航时就会触发,但是确保导航被确认之前,同时在所有组件内守卫和异步路由组件被解析之后...路由配置里调用 beforeEnter。解析异步路由组件。在被激活组件调用 beforeRouteEnter。调用全局 beforeResolve 守卫(2.5+)。导航被确认。...调用全局 afterEach 钩子。触发 DOM 更新。调用 beforeRouteEnter 守卫传给 next 回调函数,创建好组件实例会作为回调函数参数传入。

    47230
    领券