You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular 2中arguments.callee报错的替代方案求助

解决Angular中arguments.callee严格模式报错的替代方案

这个问题我之前也碰到过——Angular默认开启了严格模式,所以arguments.callee这类依赖非标准特性的写法会被直接禁用。别担心,有两个简单的替代方案,既符合严格模式要求,又能完美保留原有功能:

方案1:用具名函数替代匿名函数

最直接的解决办法就是把原本的匿名transitionend回调改成具名函数,这样移除监听器时可以直接引用函数名,不用依赖arguments.callee:

expandSection(element) { 
  // 获取元素内部内容的高度,不受其实际尺寸影响
  var sectionHeight = element.scrollHeight; 
  // 让元素过渡到其内部内容的高度
  element.style.height = sectionHeight + 'px'; 

  // 定义具名的过渡结束回调函数
  function onTransitionEnd(e) { 
    console.log(e);
    // 移除该事件监听器,直接引用函数名
    element.removeEventListener('transitionend', onTransitionEnd); 
    // 从元素的内联样式中移除height,使其回到初始值
    element.style.height = null; 
  }

  // 添加事件监听器时使用这个具名函数
  element.addEventListener('transitionend', onTransitionEnd); 
}

这个写法完全符合严格模式规范,而且逻辑和原来的代码完全一致,只是把匿名函数抽成了具名函数而已。

方案2:使用Angular的Renderer2 API(更推荐)

在Angular应用中,直接操作DOM元素其实不是最佳实践,官方更推荐使用Renderer2来处理DOM操作,这样能更好地适配Angular的变更检测和跨平台特性。下面是用Renderer2改写后的版本:

首先在组件中注入Renderer2:

import { Component, Renderer2 } from '@angular/core';

@Component({
  // 组件元数据
})
export class YourComponent {
  constructor(private renderer: Renderer2) {}

  expandSection(element: HTMLElement) { 
    const sectionHeight = element.scrollHeight; 
    this.renderer.setStyle(element, 'height', `${sectionHeight}px`); 

    // 定义具名回调
    const onTransitionEnd = (e: TransitionEvent) => { 
      console.log(e);
      // 使用Renderer2移除监听器
      this.renderer.removeEventListener(element, 'transitionend', onTransitionEnd); 
      this.renderer.removeStyle(element, 'height'); 
    }

    // 使用Renderer2添加监听器
    this.renderer.listen(element, 'transitionend', onTransitionEnd); 
  }
}

这个版本不仅解决了arguments.callee的问题,还更贴合Angular的开发规范,避免了直接操作DOM带来的潜在问题。

内容的提问来源于stack exchange,提问作者Jeremy Thomas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:27:27