博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于函数表达式的标识符/函数名
阅读量:7201 次
发布时间:2019-06-29

本文共 1189 字,大约阅读时间需要 3 分钟。

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

我们都知道,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 //undefinedfoo=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();

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

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

转载于:https://www.cnblogs.com/guoyingjie/p/7543922.html

你可能感兴趣的文章
R 语言绘制功能富集泡泡图
查看>>
Django默认ORM(一):基本配置
查看>>
iostat 监视I/O子系统
查看>>
【HDOJ】2386 Dart Challenge
查看>>
扩展欧几里德
查看>>
505C Mr. Kitayuta, the Treasure Hunter
查看>>
hdu 1045 Fire Net
查看>>
delphi 里的@^#等符号都是什么意思?
查看>>
drf 富文本编辑器上传的图片路径问题
查看>>
工作记录--WPF自定义控件,实现一个可设置编辑模式的TextBox
查看>>
【LeetCode每天一题】Validate Binary Search Tree(有效的二叉搜索树)
查看>>
git学习笔记
查看>>
高手教你恢复误删文件的秘籍
查看>>
接口服务中的日志
查看>>
MyCAT部署及实现读写分离(转)
查看>>
多个(子)进程的开启,进程的常用属性和方法
查看>>
netty入门05
查看>>
python 局部变量和全局变量
查看>>
CSS样式
查看>>
推荐算法——非负矩阵分解(NMF)
查看>>