前几天椰子在微博上发了消息说匿名函数也可以有名字,我就想了半天,有名字的匿名函数到底是什么情况??
先来看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作为一种支持函数式编程的语言,匿名函数是实现这一特性的基石之一。 #### 四、注意事项 - **性能考虑**:虽然`new Function()`构造器提供了很大的灵活性,但它可能会导致性能下降。...
### 知识点:匿名函数在JavaScript中的应用与特性 #### 标题解析:“匿名函数的一点知识” 标题“匿名函数的一点知识”简洁明了地指出本文将围绕JavaScript中的匿名函数进行讲解,旨在帮助读者深入理解匿名函数的...
JavaScript之函数(ppt)JavaScript之函数(ppt)JavaScript之函数(ppt)JavaScript之函数(ppt)JavaScript之函数(ppt)JavaScript之函数(ppt)JavaScript之函数(ppt)JavaScript之函数(ppt)JavaScript之函数...
在JavaScript中,匿名函数是一种没有名称的函数,通常作为参数传递或者用于立即执行。在上述文档中,我们看到几种不同的匿名函数使用方式: 1. **匿名函数自执行**:`(function(){})()`,这种写法会立即执行该匿名...
JavaScript中的匿名函数和闭包是两个非常重要的概念,它们在函数式编程和模块化开发中起着关键作用。 首先,让我们来理解匿名函数。匿名函数,顾名思义,是没有名称的函数。在JavaScript中,我们可以直接定义一个不...
对于已经熟悉Java的开发者来说,学习JavaScript函数式编程不仅可以拓宽视野,也有助于提升在前端开发领域的专业技能。阅读相关书籍,例如"javascript函数式编程",将帮助你更好地掌握这些概念并应用于实际项目中。
3. **数组和集合**:学习JavaScript中的数组操作,如map、filter、reduce等高阶函数的运用,以及Set和Map等ES6新增集合类型的使用。 4. **函数**:理解闭包、作用域和this的关键概念,学习箭头函数的语法和特性。 5....
JavaScript学习(一) JavaScript是一种广泛应用于网页和网络应用的脚本语言,由 Netscape 的 Brendan Eich 在1995年发明。它主要用于客户端的网页交互,赋予网页动态功能,如响应用户操作、处理数据、与服务器通信...
JavaScript,一种广泛应用于Web开发的脚本语言,是前端开发的核心技术之一。这份"JavaScript学习指南"高清PDF,无疑为想要深入理解JavaScript的初学者或有一定基础的开发者提供了宝贵的资源。下面,我们将深入探讨...
JavaScript函数是编程语言的核心组成部分,它是一段可重复使用的代码块,可以接受参数并返回值。...总结,JavaScript函数是其强大和灵活的核心特性之一。理解并熟练运用上述知识点,将有助于编写高效、可维护的代码。
学习javascript的函数
JavaScript之函数(ppt).pdf JavaScript内置对象(ppt).pdf JavaScript函数(源代码).zip JavaScript分支语句(源代码).zip JavaScript基础语法(ppt).pdf JavaScript实现轮播特效(代码).zip JavaScript常用...
浏览器是JavaScript运行的重要环境之一,了解其内部结构对于理解JavaScript的执行机制至关重要。 1. **Shell**:浏览器的用户界面部分。 2. **内核**: - **渲染引擎**:负责解析HTML和CSS,并将其渲染成可视化的...
函数表达式(匿名函数)和箭头函数(=>)是ES6新增的两种函数定义方式,简化了代码的编写。 对象是JavaScript中的核心概念,它们是键值对的集合,可以使用花括号{}创建。ES6引入了类(class)的概念,使得面向对象...
本文将深入探讨JavaScript中的三个重要概念:闭包、原型和匿名函数。 一、闭包 闭包是一种特殊的函数,它能够访问其自身作用域、外部函数作用域以及全局作用域中的变量。在JavaScript中,闭包的主要用途是创建私有...
本文将围绕JavaScript的匿名函数展开,通过实例分析,详细介绍匿名函数的定义、用法以及需要注意的事项。 首先,JavaScript中的函数可以有几种不同的定义方式。第一种是通过构造函数的方式,使用new Function()的...
JavaScript作为一种广泛应用于Web开发的脚本语言,其灵活性和强大功能在很大程度上归功于其独特的特性之一——自执行匿名函数(Immediately Invoked Function Expression,简称IIFE)。本文将深入探讨自执行匿名函数...
- 除了函数声明外,还可以使用函数表达式,如匿名函数和命名函数表达式。 9. **闭包**: - 闭包允许函数访问并操作其外部作用域的变量,即使在其定义的外部调用。 10. **高阶函数**: - 函数可以作为参数传递给...
JavaScript,一种广泛应用于Web开发的脚本语言,是前端开发的核心技术之一。它以其灵活性、动态性和丰富的交互性,使得网页不再仅仅是静态的HTML,而是能够动态响应用户操作,提供丰富的用户体验。本“JavaScript...