• js拾遗: 函数字面量


    今天落叶同学发我一篇文章,我看到一个"新"名词 "函数字面量" (也可叫直接量),当时我就郁闷了,这是什么东西? 我怎么没听说过。。
    回头翻了下权威指南,在第 4.3 章节中可以看到:从某种意义上讲,函数定义表达式可称之为 "函数直接量"。
    看样子有必要重新仔细看看权威指南了,我已经发现好多细节问题都被忽略了。

    不过在 函数字面量 定义的问题上,我们发生了一点分歧,他认为匿名函数叫做函数字面量才更准确,而我则认为,函数表达式即函数字面量。
    于是我各种百度谷歌(百度这个狗屎,根本找不到这东西)。
    其实我的习惯是去 MDN 找的,但是没找到,所以无奈谷歌之。。
    找到一个还算不错的文档: 4.2. Function Literal

    我就不做翻译了,简单说下文章所表达的意思。
    函数字面量由4部分组成。
    第一部分,关键词 function
    第二部分,函数名,但是可有可无。
    第三部分,包含在括号内的参数,当然参数也是可有可无的,括号不能少。
    第四部分,是一组包裹在大括号的语句块,也就是函数要执行的具体代码,当然不写代码也没问题,{} 是必须要的。

    乍一看,这个不就是函数的定义么,怎么说是函数字面量呢?
    其实,之前我们就说了一个限定条件,函数表达式。
    当函数做为表达式的时候,可以分成这四部分。

    第二部分,函数名,但是可有可无。
    如果是函数声明,少了函数名会报错的。
    所以说函数表达式才是这里所说的函数字面量。

    例如

    function () {}

    这个写法符合上面4条,但却不是表达式,运行会报语法错误。
    只有当作表达式的时候才能正常执行。

    (function () {});
    var a = function () {};
    var obj = {fn: function () {}};

    这样写都没问题。。

    再来看个

    var fn = function test() {};

    这个是函数声明吗?
    这个也是函数字面量,test 是这个函数的名字,但是在这里只对函数体内可见,外部是不可调用的。
    来看个测试 (点击右侧 运行 即可查看结果)

    var fn = function test() { console.log(test); };
    console.log(fn);
    fn();
    console.log(test); // 报 test 未定义

    这里的函数名可用于内部使用,比如一些递归调用的时候,这样会很方便。
    可能有人会说为什么不用 arguments.callee 呢。
    很多地方都可以看到说 arguments 是把双刃剑,是性能杀手,能避免就尽量避免使用。
    加一个函数名,调用方便,性能极致,对项目压缩也有好处,何乐而不为呢?

    好了,今天的内容分享完毕,如有说的不对之处,还望回帖指教,小生先谢过了。。

  • 相关阅读:
    自我学习笔记08
    自我学习笔记07
    自我学习笔记06
    自我学习笔记05
    自我学习笔记04
    自我学习笔记03
    自我学习笔记02
    WebApi HttpUtils
    Android 正则表达式,Pattern,Matcher基本使用
    Andriod项目结构
  • 原文地址:https://www.cnblogs.com/52cik/p/js-fix-function-literal.html
Copyright © 2020-2023  润新知