匿名自执行函数 引入 $符号定义

本文详细探讨了在网页中引入外部匿名自执行函数的最佳实践,包括其位置选择、避免预加载执行的策略以及如何正确地与DOM交互。同时,通过实例展示了在函数内部获取和修改DOM元素的正确方式,并解释了为什么将其放置在DOM加载后的时机至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

若在文件中引入外部匿名自执行函数 一般在底部或html代码中(在需要获取的dom元素之后即可)引用 在head、内引用会导致dom还未加载就执行,若函数内有获取dom元素 并设置样式的代码 则会发生错误 并且它的加载发生在window.onload事件以前 因为载入外部样式也算是onload事件 而onload事件只在页面加载完成后触发 另外 浏览器显示正在载入表示正在加载dom 对自执行匿名函数执行时断点调试 可以发现一直是载入状态 侧面说明了它的执行在onload以前
并且 如
<script type="text/javascript" src="yun.js">console.log('end')</script>

之类链接外部文件的代码 先执行外部文件再执行标签内内容 比如之后代码 console.log('end') 最后执行

定义 $('id')


$=function(id){return typeof (id) == 'string' ?document.getElementById(id):null}


获取举例
$('div1');
$('div1').style.background='red';

or

var a=$('div1');
a.style.background='red';
效果一致

使用匿名自执行函数 遇见无法执行的语句 则匿名自执行函数内部后面的语句不再执行 会报错 结束加载 触发onload事件 继续执行onload触发函数
<think>好的,用户让我介绍一下C#的匿名函数。我需要先回忆一下相关知识,确保信息准确。首先,匿名函数在C#中主要有两种形式:匿名方法和Lambda表达式。记得它们都是从C# 2.0和3.0引入的,对吧? 用户可能已经有一定的基础,但也许不太清楚两者的区别和用法。我应该从定义开始,说明匿名函数是没有名称的方法,用于简化代码,尤其是在需要委托的地方。然后分点介绍匿名方法和Lambda表达式,比较它们的语法差异,比如匿名方法使用delegate关键字,而Lambda用=>符号。 接下来,需要提到它们的应用场景,比如事件处理、LINQ查询。这时候举例子会比较好,比如用Lambda在List的Find方法中做筛选。例子要简单明了,让用户容易理解。 还要注意匿名函数的闭包特性,也就是它们可以捕获外部变量。这部分可能对用户来说有点难,得解释清楚变量捕获可能导致的问题,比如循环变量在闭包中的延迟求值。这时候给出一个例子,比如循环中创建多个匿名函数,最后执行时都引用了同一个变量,导致意外结果。然后说明C# 5.0之后的改进,foreach循环变量的处理方式不同,避免这个问题。 用户可能还关心Lambda表达式的两种形式:表达式Lambda和语句Lambda。需要区分它们,比如表达式Lambda是单一表达式,而语句Lambda可以有多行代码,用大括号括起来。 最后,总结一下使用匿名函数的好处:简化代码、提高可读性、灵活传递逻辑。同时提醒注意事项,比如避免滥用,保持代码可维护性。可能需要提到性能方面的考虑,但不确定是否需要深入,可能用户更关注用法而不是底层优化。 检查是否有遗漏的部分,比如匿名函数与委托类型的关系,是否要提到Func和Action委托?可能有必要,因为Lambda通常与这些委托一起使用。例如,Func<int, int> square = x => x * x;这样的例子可以帮助用户理解类型推断。 另外,是否要讨论匿名函数的限制?比如不能包含goto、break等跳转语句到外部块,或者参数类型必须明确等。这些细节可能对高级用户有用,但如果是入门介绍,可能暂时不需要深入。 确保例子中的代码格式正确,使用$...$$$...$$的数学表达式吗?不过用户的问题是关于C#的,可能不需要数学公式,但需要遵循系统指令中的格式要求。比如如果有涉及数学的例子,如x => x * x,应该用行内格式$x \Rightarrow x \times x$吗?但原例子里是代码,可能应该用代码块而非LaTeX。不过系统指令提到数学表达式必须用$...$,但代码可能属于不同部分。可能需要确认,但用户的问题不涉及数学内容,所以可能不需要处理。 最后,保持回答结构清晰,分点讲解,用例子辅助,确保用户能一步步理解。避免使用过于技术化的术语,但也要准确。检查语法和术语是否正确,比如闭包、委托、Lambda表达式等是否正确使用。</think>### C#匿名函数详解 #### 1. **定义与作用** C#匿名函数是一种**无需显式定义方法名称**的代码块,可直接作为参数传递或赋值给委托类型。它主要用于简化代码,尤其在需要**临时逻辑**或**短小函数**的场景(如事件处理、LINQ查询)。 #### 2. **两种形式** C#匿名函数分为两种语法形式: - **匿名方法**(C# 2.0引入) 使用`delegate`关键字定义,例如: ```csharp Func<int, int> square = delegate(int x) { return x * x; }; ``` - **Lambda表达式**(C# 3.0引入) 使用`=>`运算符,更简洁: ```csharp Func<int, int> square = x => x * x; ``` #### 3. **Lambda表达式详解** ##### 语法类型 - **表达式Lambda** 单行代码,无需大括号: ```csharp (参数) => 表达式 ``` 示例:`x => x > 5` - **语句Lambda** 多行代码,需用大括号: ```csharp (参数) => { // 多行逻辑 return 结果; } ``` 示例: ```csharp (a, b) => { int sum = a + b; return sum * 2; } ``` #### 4. **闭包特性** 匿名函数可**捕获外部变量**,形成闭包。例如: ```csharp int factor = 2; Func<int, int> multiplier = x => x * factor; Console.WriteLine(multiplier(5)); // 输出10 ``` ⚠️ **注意**:闭包捕获的是**变量引用**而非值。循环中需谨慎: ```csharp var actions = new List<Action>(); for (int i = 0; i < 3; i++) { actions.Add(() => Console.WriteLine(i)); } foreach (var action in actions) { action(); // 输出3次3(C# 5.0) } ``` C# 5.0+ 中,`foreach`循环变量会**按迭代次数创建副本**,避免此问题。 #### 5. **应用场景** - **委托与事件处理** 简化事件订阅: ```csharp button.Click += (sender, e) => MessageBox.Show("Clicked!"); ``` - **LINQ查询** 结合Lambda实现灵活过滤: ```csharp var filteredList = numbers.Where(n => n % 2 == 0).ToList(); ``` - **异步编程** 用于`Task`或`async/await`中的回调: ```csharp Task.Run(() => { // 后台逻辑 }); ``` #### 6. **注意事项** - **类型推断**:Lambda参数类型可省略(编译器自动推断)。 - **性能**:频繁调用的场景中,匿名函数可能产生额外开销(如闭包对象分配)。 - **可读性**:避免过度嵌套或复杂逻辑,保持代码简洁。 #### 7. **总结** 匿名函数通过简化代码结构,提升了C#的灵活性与表达力。核心价值在于: - 减少冗余代码 - 支持函数式编程风格 - 增强事件处理与集合操作的便捷性 合理使用Lambda表达式和匿名方法,可显著提升开发效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值