JavaScript匿名函数:定义方式、执行模式与模块应用详解
本文详解JavaScript中匿名函数的定义方式,对比函数字面量与Function构造函数的区别,介绍三种执行模式。重点阐述如何利用匿名函数结合var关键字实现模块模式,避免全局变量污染,并分析其作为函数式编程基石的应用价值。
匿名函数概述
匿名函数能有效确保在页面中嵌入JavaScript代码时,不会引发全局变量污染问题。
这种机制在向不熟悉代码结构的页面添加JavaScript逻辑时尤为有效,且实现方式简洁优雅。
匿名函数的定义
一、什么是匿名函数?
在JavaScript中,定义函数通常有以下三种方式:
1. 函数声明语句(Function Declaration):
function fnMethodName(x){alert(x);}
2. 函数字面量(Function Literals):
var fnMethodName = function(x){alert(x);}
3. Function() 构造函数:
var fnMethodName = new Function('x','alert(x);')
上述三种方式均定义了名为fnMethodName的函数。
第一种是最常用的方法;后两种则是将一个函数赋值给变量fnMethodName,该函数没有显式名称,即称为匿名函数。
实际上,许多编程语言都支持匿名函数。
函数字面量与Function构造函数的区别
二、函数字面量与Function()构造函数的区别
虽然函数字面量通常表现为匿名函数,但语法允许为其指定一个内部名称。当编写递归函数时,可以通过该内部名称调用自身,而使用Function()构造函数则无法实现这一点。
var f = function fact(x) { if (x < = 1) return 1; else return x*fact(x-1); };
Function()构造函数允许在运行时动态创建和编译JavaScript代码,其特性类似于全局函数eval()。
Function()构造函数每次执行时都会解析函数主体,并创建一个新的函数对象。因此,在循环或频繁执行的函数中调用Function()构造函数会导致效率极低。相反,函数字面量在遇到时不会重新编译。
使用Function()构造函数创建的函数不遵循典型的作用域规则,它始终将自身视为顶层函数执行。
var y = "global";
function constructFunction() { var y = "local"; return new Function("return y"); // 无法获取局部变量 } alert(constructFunction()()); // 输出 “global”和函数关键字定义相比Function()构造器有自己的特点且要难以使用的多,
因此,这种技术通常较少使用。
而函数字面量表达式与函数关键字定义非常接近。
考虑到前述区别,虽然有消息指出字面量的匿名函数在OS X 10.4.3下的某些webkit引擎中存在bug,
但我们平常所说的匿名函数均指采用函数字面量形式的匿名函数。
匿名函数的执行模式
三、匿名函数的代码模式
错误模式:直接执行会导致语法错误,浏览器无法正常工作。
function(){ alert(1); }();
函数字面量:首先声明一个函数对象,然后立即执行它。
(function(){ alert(1); } ) ( );
优先表达式:
( function(){ alert(2); } ( ) );
void操作符:
void function(){ alert(3); }()这三种方式是等同的,hedger wang因为个人原因比较喜欢第3种,而在实际应用中我看到的和使用的都是第1种。
匿名函数的实际应用
四、匿名函数的应用
《Javascript的一种模块模式》中的第一句话就是“全局变量是魔鬼”。
配合var关键字,匿名函数可以有效的保证在页面上写入Javascript,而不会造成全局变量的污染。
这在给一个不是很熟悉的页面增加Javascript时非常有效,也很优美。
实际上,YUI以及其相应的范例中大量使用匿名函数,其他的Javascript库中也不乏大量使用。
Javascript的函数式编程(functional programming)的基石。
具体请看《用函数式编程技术编写优美的 JavaScript》和《函数式JavaScript编程指南》。
以上这篇JavaScript中匿名函数的用法及优缺点详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。
D3.js 比例尺与坐标轴的配置详解
2026-11-05 16:54:46
JavaScript怎么遍历对象的Symbol键和不可枚举属性
2026-11-05 13:13:39
封装一个健壮的JS字符串判空工具函数
2026-11-05 12:16:14
JavaScript合并数组的三种常用方法:concat、扩展运算符与push
2026-11-05 11:22:29
JavaScript立即执行函数(IIFE)是什么及基本语法
2026-11-05 10:51:19
相关标签:
