函数的标识符也就是通常说的函数名,在函数声明中不可省略,而函数表达式中可以省略。

我们都知道,javascript引擎将函数名视同变量名,所以采用function命令声明函数时,整个函数会像变量提升一样被提升到代码头部。所以函数声明先执行也不会报错,而函数表达式则会。

对于下面的代码

  foo();bar();var foo=function bar(){console.log(1);}

我们根据变量提升和函数提升的理论可以肯定是会报错的,实际运行下

foo(); //Uncaught TypeError: foo is not a function

bar(); //Uncaught ReferenceError: bar is not defined

一开始我的理解是,变量foo被提升后,等同于

var foo //undefined
foo=function bar(){console.log(1);
}

浏览器还不知道bar是什么,报错 ReferenceError: defined 很正常。那么下面这样呢:

var foo=function bar(){console.log(1);
}
bar();

或者

new function bar(){//作为New表达式(NewExpression)的一部分,它也是函数表达式console.log(1);
}
bar();

运行结果依旧是bar(); //Uncaught ReferenceError: bar is not defined。这和想象中不符啊,没有先执行,为什么bar依旧是defined?既然函数标识符被视同变量名,那么对于函数表达式的标识符,怎么会找不到,所以它的作用域在哪里?

所以有了下面的代码:

var foo = function bar(){console.log(bar);
}
foo();

打印结果如下:

ƒ bar(){
console.log(bar);
}

果然思路没错,函数表达式的标识符的作用域就在它自己的函数体。函数名是不能调用函数表达式的,如果要调用,也只有递归的情况了。

除此之外,通过搜索引擎找到关于函数表达式的标识符这样的卵用,例子如下:

var f1 = function b1(){return f2();
}
var f2 = function b2(){return f3();
}
var f3 = function b3(){debugger;
}
f1();

当每个函数都给上标识符,那么调用栈就会显示被调用的函数的名字

是不是看起来就比较明朗√

关于函数表达式的标识符/函数名相关推荐

  1. JavaScript 函数声明,函数表达式,匿名函数,立即执行函数之区别

    函数声明:function fnName () {-};使用function关键字声明一个函数,再指定一个函数名,叫函数声明. 函数表达式 var fnName = function () {-};使 ...

  2. 函数声明、函数表达式、匿名函数、立即执行函数

    函数声明:function fnName () {-};使用function关键字声明一个函数,再指定一个函数名,叫函数声明. 函数表达式 var fnName = function () {-};使 ...

  3. 函数表达式与命名函数区别

    函数表达式: 1.把一个函数赋值给一个变量,叫做函数表达式 2.var 变量名 = 匿名函数; 3.函数表达式中,匿名函数后一定要有";"分号 4.变量名+()括号 即调用了函数 ...

  4. 逆推继承看原型 函数的角色 函数声明和函数表达式的区别 函数中this指向的问题

    逆推继承看原型 <!DOCTYPE html> <html lang="en"> <head><meta charset="UT ...

  5. matlab已知函数表达式画函数图像,怎么用matlab画已知函数表达式的一个函数图像?函数比较复杂的……...

    点击查看怎么用matlab画已知函数表达式的一个函数图像?函数比较复杂的--具体信息 答:要具体哦,如果一个自变量,函数图像就是曲线,用plot 如果是2个自变量,函数图像就是曲面了,如f=3*exp ...

  6. 【JS基础】立即执行函数表达式(自执行函数)

    立即执行函数表达式 立即执行函数表达式,大部分人也称为自执行函数. 自执行函数的写法 匿名函数 (function() {console.log(2) })() 具名函数 (function log( ...

  7. matlab 中调用s函数表达式,[求助]S函数中能否调用M函数

    [求助]S函数中能否调用M函数 我现在写了一个S-FUNCTION 里面调用了一些M函数,当把S函数的名字写入S-FUNCTION块的时候 总是出现 ??? SWITCH expression mus ...

  8. 一文探索 JavaScript 最强大特性—函数表达式

    函数是 ECMAScript 中最有意思的部分之一,这主要是因为函数实际上是对象.每个函数都是 Function 类型的实例,而 Function 也有属性和方法,跟其他引用类型一样.因为函数是对象, ...

  9. 深入理解JavaScript系列(2):揭秘命名函数表达式(转)

    前言 网上还没用发现有人对命名函数表达式进去重复深入的讨论,正因为如此,网上出现了各种各样的误解,本文将从原理和实践两个方面来探讨JavaScript关于命名函数表达式的优缺点. 简 单的说,命名函数 ...

最新文章

  1. 产品策划三:App启动页的策划方案
  2. MySQL STR_TO_DATE函数
  3. 在Servlet使用getServletContext()获取ServletContext对象出现java.lang.NullPointerException(空指针)异常的解决办法...
  4. 爬虫实战:嗅事百科段子多页爬取
  5. VTK:Dijkstra 图形测地线路径用法实战
  6. linux100day(day6)--shell脚本简单逻辑
  7. redis主从复制和哨兵机制
  8. JVM性能分析与定位
  9. 【转】关于PHP的header(P3P: CP=CURa……)
  10. java版 高斯过程_高斯过程scikit-learn - 异常
  11. 设计模式学习之---Facade(外观)模式
  12. linux系统上查询ip地址归属
  13. Mac google浏览器可以百度 无法登录账号的解决方案
  14. API Guides Contacts Provider (三)
  15. 旷视科技科创板IPO上会在即,毫不吝啬研发投入
  16. css裁剪图片 clip-path
  17. 亚马逊云机器人平台RoboMaker新功能WorldForge使用测试
  18. Kotlin高仿微信-第58篇-开通VIP
  19. 自己快成猪了。。。。
  20. 格林耐特交换机配置命令参考

热门文章

  1. Android导出应用数据库
  2. php的数组长度,php中获得数组长度的方法
  3. 几个必备的蹭网软件介绍
  4. NLP(三十七)使用keras-bert实现英语序列标注任务
  5. 牛客网之SQL非技术快速入门(6)--时间、日期
  6. buildroot override 机制
  7. 简单代码训练(if语句)
  8. 二、水平管道中CO2气液两相的流量研究
  9. TCP/IP协议簇之网络层
  10. vue打印功能vue-print-nb