`

JavaScript学习之四 — 点滴之匿名函数

 
阅读更多

前几天椰子在微博上发了消息说匿名函数也可以有名字,我就想了半天,有名字的匿名函数到底是什么情况??

先来看js中函数的三种定义方式吧:

/**
 * 1、function关键字语句
 */
function fn1(){
	alert("fn1");
}
/**
 * 2、函数字面量(Function Literals)
 */
var fn2 = function(){
	alert("fn2");
};
/**
 * 3、Function构造函数型
 */
var fn3 = new Function('x','alert("fn3:"+x)');
fn1();
fn2();
fn3(3);

其中2函数字面量和3Function构造函数型都是匿名函数,但是两者有区别:

1、函数字面量可以有名字,而Function不能有

 

/**
 * 这就是匿名函数,fn4是匿名函数的名字;<br>
 * 但是fn4只能在函数内调,在外部调会报function is not defined
 * 
 * @param {int}
 *            x
 * @return {Number}
 */
var fn5 = function fn4(x) {
	if (x <= 0)
		return 1;
	return x * fn4(x - 1);
};
alert(fn5(5));
// 此处会报错:fn4 is not defined
alert(fn4(4));

 

 当然此处的递归可以用arguments.callee代替,而且很多书上都推荐用arguments.callee,因为函数名可能是改变的。

 

/**
 * 用arguments.callee代替匿名函数的名字实现递归
 * @param {} x
 * @return {Number}
 */
var fn6 = function (x) {
	if (x <= 0)
		return 1;
	return x * arguments.callee(x - 1);
};
alert(fn6(5));

 

2、Function可以运行时动态的创建和编译js代码,但是Function代码每次运行的时候都会解析函数主题,生成函数对象,循环时候效率很低。

3、Function内变量的作用域是全局作用域

 

var x = 'hello';
/**
 * 此处弹出hello
 */
void function() {
	var x = 'world';
	var fn7 = new Function("alert(x)");
	fn7();
}();

 

 在第一点我们已经看到了匿名函数的名字,一般用作递归,但是如果仅仅用于递归,因为已经有了arguments.callee,是不是显得鸡肋了?

 

进一步,我们来看一下几种匿名函数的代码模式

1、首先来个错误的:

 

/**
 * 语法错误
 */
function (){
	alter("error");
}();

 

2、函数字面量,为什么function外边这个括号很重要?括号里的内容先执行,执行后()所在的地方会被执行结果所替代,结果可能是值、函数,这里是函数

 

/**
 * 字面量函数
 */
(function(){
	alert("literals");
})();

 

3、优先表达式,括号从里到外执行

 

/**
 * 优先表达式
 */
(function() {
	alert("priority");
}());

4、void操作符,void可以执行一个没有圆括号包围的单独的操作数

 

 

/**
 * void操作符
 */
void function(){
	alert("void");
}();

匿名函数有什么好处呢?一次性,即执行一次之后不会放到内存,减少内存占用:

 

/**
 * 在计算过val后内存中一直会保存add函数
 */
function add(x,y){
	return x + y;
}
var val = add(2,3);
alert(val);

/**
 * 在计算出val2之后,内存中不会保存函数
 */
var val2 = function add2(x,y){
	return x + y;
}(2,3);
alert(val2);

/**
 * 在计算出val3之后,内存中也不会保存add3函数。
 */
var val3 = function add3(x,y){
	return x + y;
}(2,3);
alert(val3);

如图:

 

 

分享到:
评论

相关推荐

    Javascript的匿名函数

    - **函数式编程**:JavaScript作为一种支持函数式编程的语言,匿名函数是实现这一特性的基石之一。 #### 四、注意事项 - **性能考虑**:虽然`new Function()`构造器提供了很大的灵活性,但它可能会导致性能下降。...

    Javascript的匿名函数讲解

    匿名函数是JavaScript语言中的一个强大特性,它允许我们不给函数命名,直接声明并执行。在本文中,我们将深入了解匿名函数的定义、特点、代码模式以及应用。 首先,需要明白什么是匿名函数。在JavaScript中,定义...

    匿名函数的一点知识

    ### 知识点:匿名函数在JavaScript中的应用与特性 #### 标题解析:“匿名函数的一点知识” 标题“匿名函数的一点知识”简洁明了地指出本文将围绕JavaScript中的匿名函数进行讲解,旨在帮助读者深入理解匿名函数的...

    JavaScript之函数(ppt)

    JavaScript之函数(ppt)JavaScript之函数(ppt)JavaScript之函数(ppt)JavaScript之函数(ppt)JavaScript之函数(ppt)JavaScript之函数(ppt)JavaScript之函数(ppt)JavaScript之函数(ppt)JavaScript之函数...

    JavaScript 匿名函数和闭包介绍

    在讨论JavaScript编程语言时,匿名函数和闭包是两个重要的概念,它们在函数式编程和模块化代码设计中扮演着核心角色。匿名函数是没有具体名称的函数,它们可以是独立的,也可以是表达式的一部分,通常用于定义临时...

    JavaScript程序设计课件:匿名函数.pptx

    概念:所谓函数表达式指的是将声明的函数赋值给一个变量,通过变量完成函数的调用和参数的传递,它也是JavaScript中另一种实现自定义函数的方式。 5.5 匿名函数 函数表达式 var fn = function sum(num1, num2) { ...

    深入研究JavaScript的匿名函数.doc

    JavaScript中的匿名函数是一种没有明确标识符的函数表达式,它可以在需要时被立即执行或作为其他数据结构的一部分使用。在JavaScript中,函数是第一类对象,这意味着它们可以被赋值给变量、作为参数传递和作为其他...

    javascript函数式编程

    JavaScript函数式编程是利用JavaScript语言编写函数式风格代码的一种编程范式。函数式编程强调使用纯函数、避免副作用、函数的不可变性以及利用高阶函数等概念。通过阅读《JavaScript函数式编程指南》,读者可以了解...

    JavaScript函数(源代码)

    JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)JavaScript函数(源代码)...

    javascript指南和函数式编程

    3. **数组和集合**:学习JavaScript中的数组操作,如map、filter、reduce等高阶函数的运用,以及Set和Map等ES6新增集合类型的使用。 4. **函数**:理解闭包、作用域和this的关键概念,学习箭头函数的语法和特性。 5....

    JavaScript函数式编程.pdf

    不过,由于【标题】中提供了文档的名称——"JavaScript函数式编程.pdf",我可以根据这个名称扩展出关于JavaScript函数式编程的知识点。 JavaScript函数式编程的知识点非常丰富,涉及很多方面的内容,下面将详细介绍...

    JS匿名函数、闭包

    **匿名函数**,又称**拉姆达函数**,是一种在JavaScript中常见的函数形式,这类函数没有名称,因此不能像命名函数那样通过名称来调用。匿名函数通常作为临时使用的函数,在需要的地方直接定义并执行。 ##### 特点:...

    JavaScript学习(一)

    JavaScript学习(一) JavaScript是一种广泛应用于网页和网络应用的脚本语言,由 Netscape 的 Brendan Eich 在1995年发明。它主要用于客户端的网页交互,赋予网页动态功能,如响应用户操作、处理数据、与服务器通信...

    JavaScript学习指南 高清 PDF

    JavaScript,一种广泛应用于Web开发的脚本语言,是前端开发的核心技术之一。这份"JavaScript学习指南"高清PDF,无疑为想要深入理解JavaScript的初学者或有一定基础的开发者提供了宝贵的资源。下面,我们将深入探讨...

    C#与JAVASCRIPT函数的相互调用 C#调用JAVASCRIPT函数的调用 JAVASCRIPT调用C#函数的调用

    C#与JAVASCRIPT函数的相互调用 C#调用JAVASCRIPT函数的调用 JAVASCRIPT调用C#函数的调用

    JavaScript学习资料JavaScript基础语法函数及相关源代码资料.zip

    JavaScript之函数(ppt).pdf JavaScript内置对象(ppt).pdf JavaScript函数(源代码).zip JavaScript分支语句(源代码).zip JavaScript基础语法(ppt).pdf JavaScript实现轮播特效(代码).zip JavaScript常用...

    JavaScript中匿名函数的用法及优缺点详解_.pdf

    JavaScript中的匿名函数是一种不具有名称的函数,它们主要通过函数表达式或Function构造函数来创建。匿名函数在JavaScript中有着广泛的应用,特别是在避免全局变量污染、实现模块化和函数式编程等方面。以下是对匿名...

    JavaScript学习基础学习心得

    浏览器是JavaScript运行的重要环境之一,了解其内部结构对于理解JavaScript的执行机制至关重要。 1. **Shell**:浏览器的用户界面部分。 2. **内核**: - **渲染引擎**:负责解析HTML和CSS,并将其渲染成可视化的...

Global site tag (gtag.js) - Google Analytics