当前位置: 首页 > news >正文

Why is it called “callback function“

The Crucial Difference Between func(arg)and () => func(arg)

These two patterns have fundamentally different behaviors in JavaScript/TypeScript:

1. ​Immediate Execution vs. Delayed Execution

// Immediately executes func with arg
func(arg); // Creates a function that WILL execute func(arg) when called later
const delayedFunc = () => func(arg);

2. ​Call Site Behavior

// Scenario: Passing to event handler
button.addEventListener('click', func(arg)); 
// ❌ WRONG: func executes IMMEDIATELY during setupbutton.addEventListener('click', () => func(arg)); 
// ✅ CORRECT: func executes WHEN clicked

3. ​Argument Binding

let value = 10;// Captures CURRENT value
const now = () => func(value); // Will use FUTURE value when executed
const later = func(value); value = 20;
now(); // 20 (current value when created)
later; // 10 (value at creation time)

Key Differences Table

Characteristic

func(arg)

() => func(arg)

Execution Timing

Immediate

Deferred until called

Return Value

Result of func

Function reference

Use in Callbacks

❌ Usually wrong

✅ Correct

Argument Binding

Static (value at call time)

Dynamic (closure captures)

thisContext

Depends on calling context

Inherits from surrounding

Memory Efficiency

No closure created

Creates closure

When to Use Each

Use func(arg)When:

// 1. Immediate execution needed
const result = calculateTotal(price);// 2. Inline in expressions
if (validateInput(input)) { ... }// 3. No callback involved
logger.log("Event fired");

Use () => func(arg)When:

// 1. Event handlers
button.onclick = () => submitForm(data);// 2. Asynchronous callbacks
setTimeout(() => refreshData(), 1000);// 3. Preserving arguments in loops
items.forEach(item => {button.addEventListener('click', () => selectItem(item));
});// 4. Maintaining context
class Component {constructor() {this.value = 42;// Without arrow: this would be undefinedbutton.onclick = () => this.handleClick(); }handleClick() {console.log(this.value); // 42}
}

Common Pitfall & Solution

// ❌ Problem: All alerts show "3"
for (var i = 0; i < 3; i++) {setTimeout(() => alert(i), 100);
}// ✅ Solution 1: IIFE captures current i
for (var i = 0; i < 3; i++) {(function(j) {setTimeout(() => alert(j), 100);})(i);
}// ✅ Solution 2: Use let (block-scoped)
for (let i = 0; i < 3; i++) {setTimeout(() => alert(i), 100);
}

Performance Considerations

  • () => func(arg)creates a new function​ each time it's called

  • For hot code paths, avoid creating functions in loops:

    // ❌ Creates new function on every iteration
    items.forEach(item => {element.addEventListener('click', () => handle(item));
    });// ✅ Better: Single function reference
    const handler = (item) => () => handle(item);
    items.forEach(item => {element.addEventListener('click', handler(item));
    });

Real-World Example

// Search component
class SearchBox {constructor() {this.input = document.getElementById('search');this.input.addEventListener('input', () => this.filterResults());// NOT this.input.addEventListener('input', this.filterResults());}filterResults() {console.log(`Filtering: ${this.input.value}`);}
}

TypeScript Considerations

// Explicit typing for arrow functions
const handler: (event: MouseEvent) => void = () => processClick(data);// Generic function preservation
const wrapper = <T>(arg: T) => () => process(arg);

Summary

  • func(arg)​ = Execute now, get result

  • () => func(arg)​ = Create a recipe to execute later

Always use arrow functions for callbacks to:

  1. Control execution timing

  2. Preserve arguments and context

  3. Create closures for dynamic values

The arrow function pattern is essential for proper asynchronous and event-driven programming in JavaScript/TypeScript.

http://www.dtcms.com/a/525719.html

相关文章:

  • axios响应发生错误时的情况列表
  • 网站备案 接口360网页游戏大厅官网
  • vue导出数据到excel
  • 网站续费一年多少钱西安旅游网站建设
  • 探码科技再获“专精特新”认定:Baklib引领AI内容管理新方向
  • 郑州大型网站建设价格百度广告联盟app
  • 简述网站开发具体流程巫山集团网站建设
  • 【Diffusion Model】发展历程
  • 作用域 变量提升(Hoisting)的代码输出题
  • 商城网站建设最好的公司免费网站打包app
  • 网站没有关键词自己做的网站如何上首页
  • 【Matlab】异常处理:MException
  • 郑州友网站建设四川省建设监理协会网站
  • 本地部署Docsify生成文档网站并实现公网环境远程访问
  • 有做a50期货的网站服务周到的微网站建设
  • Linux:开源时代的隐形基石
  • 毕业设计做企业门户网站搭建网页的基础语言
  • 破解本地生活 “到店-复购“ 断层!我店+微团双模式,核销率提升90%
  • 仿qq商城版淘宝客网站源码模板+带程序后台文章dede织梦企业程序网站做担保交易平台
  • Rust中的智能指针
  • 网站建设论文提纲论坛门户网站开发
  • 有哪些单页网站网站建设代码走查
  • 四线城市做网站建设怎么样网页设计与制作全过程
  • Telegram tdlib客户端Java本地编译打包
  • 上海做网站的公司是什么桂林象鼻山景区介绍
  • 阿里云渠道商:OSS与传统存储系统的差异在哪里?
  • Redis事务和Lua脚本对比
  • 广州微信网站建设报价表宝塔建站系统
  • Git 日常
  • 2. C语言 多级指针