理解函数表达式的函数名称

函数表达式:

function 函数名称(可选)(参数:可选){函数体}。

之前不怎么理解:既然函数表达式里的函数名称可选,那有函数名与没函数名又有什么区别呢。

按照EMCA标准,函数表达式格式如下:

FunctionExpression :
function Identifier opt ( FormalParameterList opt ){ FunctionBody }

这种函数表达式又称有名函数表达式(named function expression),这个名称只能在函数内部使用

var f = function foo(){
  return typeof foo; // "foo" is available in this inner scope
};
// `foo` is never visible "outside"
typeof foo; // "undefined"
f(); // "function"

那使用有名函数表达式又有什么意义呢?

  1. 使调试更加方便
  2. 可以递归调用自己

    a = function b(i) {
      if (i>10) {
        return i;
      }
      else {
        return b(++i);
      }
    }
    
    console.log(a(5));  // outputs 11
    console.log(a(10)); // outputs 11
    console.log(a(11)); // outputs 11
    console.log(a(15)); // outputs 15
  3. 使匿名函数更有意义

    

参考资料: 1.Named function expressions demystified (http://kangax.github.io/nfe/) 
      2. 《你不知道的javascript(上卷)》P27-P28
           3. What is the difference between a function expression vs declaration in JavaScript?      
                   4 .深入理解JavaScript系列(2):揭秘命名函数表达式     
                   5.使用函数表达式时,匿名函数和命名函数有区别吗?

时间: 2024-10-19 02:26:12

理解函数表达式的函数名称的相关文章

js函数表达式和函数声明的区别

我们已经知道,在任意代码片段外部添加包装函数,可以将内部的变量和函数定义"隐 藏"起来,外部作用域无法访问包装函数内部的任何内容. 例如: var a = 2; function foo() { // <-- 添加这一行 var a = 3; console.log( a ); // 3 } // <-- 以及这一行 foo(); // <-- 以及这一行 console.log( a ); // 2 虽然这种技术可以解决一些问题,但是它并不理想,因为会导致一些额外的

变量声明置顶规则、函数声明及函数表达式和函数的arguments属性初始化

一.变量声明和变量赋值: if (!("a" in window)) { var a = 1; } alert(a);//a为? 你可能认为alert出来的结果是1,然后实际结果是"undefined".要了解为什么,我们需要知道JavaScript里的3个概念: 1.所有的全局变量都是window的属性,语句 var a = 1;等价于window.a = 1; 可以用如下方式来检测全局变量是否声明: "变量名称" in window 2.声明

为什么if else 语句里不能用函数声明定义函数,而可以用函数表达式定义函数

在<JavaScript高级程序设计>第三版第7章函数表达式部分讲到,定义函数有两种方式:一种是函数声明,另一种就是函数表达式.函数声明的语法是这样的.function functionName(arg0, arg1, arg2) {//函数体} 关于函数声明,它的一个重要特征就是函数声明提升( function declaration hoisting),意思是在执行代码之前会先读取函数声明.这就意味着可以把函数声明放在调用它的语句后面.sayHi();function sayHi(){al

函数表达式和函数声明~(自己的记录)

在ECMAScript中,创建函数的最常用的两个方法是函数表达式和函数声明,两者期间的区别是有点晕,ECMA的规范明确了一点~函数声明必须带有标示符 (Identifier)就是大家说的(函数名),而函数表达式则可以省略函数名. 那么没有函数名那肯定就是函数表达式了,那么有函数名时,如何区分它是函数表达式还是函数声明呢~~如果是作为赋值表达式的一部分则为函数表达式,如果是包含在一个函数体内,或者位于程序的最顶部的话则作为函数声明~ function foo(){} // 声明,因为它是程序的一部

JS中函数表达式与函数声明的区别

hello,沐晴又来更新啦,今天呢,跟大家讲讲让人头疼的函数表达式和函数声明,反正我当初看那本高级程序的时候,是没怎么看太透,哈哈.我是个比较重基础的人,跟我一起探讨函数表达式和函数声明的世界吧. 首先呢,先看看他们的颜值:   函数声明:function 函数名(){}   函数表达式:function 函数名(可写可不写)(){}; (不写名叫做匿名函数表达式.写名叫做命名函数表达式.推荐用匿名的.) 这么一看长的好像没啥区别,反正颜值也都不高.那么我们如何区别是函数表达式还是函数声明呢?答

0143 JavaScript预解析:概念、变量预解析、函数预解析、函数表达式声明函数问题

4.1 预解析的相关概念 JavaScript 代码是由浏览器中的 JavaScript 解析器来执行的. JavaScript 解析器在运行 JavaScript 代码的时候分为两步:预解析 和 代码执行. 预解析:在当前作用域下, JS 代码执行之前,浏览器会默认把带有 var 和 function 声明的变量在内存中进行提前声明或者定义. [提升到当前作用域的最顶部.] 代码执行: 从上到下执行JS语句. 预解析会把变量和函数的声明在代码执行之前执行完成.[声明提前,赋值留在原地.] 4.

函数表达式和函数声明

学习文章----汤姆大叔的博客 总结笔记 函数声明: 1.函数声明必须要有名称 2.位置只能在全局上下文和函数体内,不能出现在代码块(if)中 函数表达式: 特点:不会影响上下文的全局对象VO var foo = {}; (function initialize() { var x = 10; foo.bar = function () { alert(x); }; })(); foo.bar(); // 10; alert(x); // "x" 未定义 1.表达式可以没有名称,表达式

javascript笔记05:函数表达式和函数语句的区别

1.首先是函数语句: myfunc(); function myfunc() { //执行一些语句 } 当函数语句被定义的时候,在一个脚本代码被优先考虑,因此,无论该函数是定义之前或者定义之后都可以被脚本使用,就像上面的语句一样. 2.函数表达式: myfunc(); var myfunc = function() { //执行的语句 } 这上面的语句是无法成功运行的,只有像下面的语句才可以成功运行额: var myfunc = function() { //执行的语句 } myfunc();

深入理解JavaScript系列(4):立即调用的函数表达式

前言 大家学JavaScript的时候,经常遇到自执行匿名函数的代码,今天我们主要就来想想说一下自执行. 在详细了解这个之前,我们来谈了解一下“自执行”这个叫法,本文对这个功能的叫法也不一定完全对,主要是看个人如何理解,因为有的人说立即调用,有的人说自动执行,所以你完全可以按照你自己的理解来取一个名字,不过我听很多人都叫它为“自执行”,但作者后面说了很多,来说服大家称呼为“立即调用的函数表达式”. 本文英文原文地址:http://benalman.com/news/2010/11/immedia