函数对于我们这些程序员来说,在熟悉不过啦,我们几乎每天能在写函数,使用函数。可是,在javascript中,大家知道几种函数调用的语句呢?在工作中,常用到的函数调用的语句就一两 个。那为啥大家知道我还在这里写博客,没事消磨大家的时间。想要知道,请耐心看完,你就明白啦。

javascript中的函数本身是一个变量/值,因此函数调用其实是一个表达式,如图1

所以,下面代码就是函数调用语句,它也是一个表达式语句:

functionName();

在javascript中具名函数可以使用上面方法直接调用,匿名函数可以通过引用变量调用,如果没有引用的匿名函数怎么调用呢?下面的例子说明这三种情况:

// 实例1:具名函数直接调用
function fnName() {// 函数体
}
fnName();// 实例2:匿名函数通过引用变量调用var fnName = function () {// 函数体
};
fnName();// 实例3:没有引用的匿名函数的调用(1)

(function () {// 函数体
}());// 实例4:没有引用的匿名函数的调用(2)

(function () {// 函数体
})();// 实例5:没有引用的匿名函数的调用(3)void function () {// 函数体
}();

实例1,2的用法比较常见,实例4在现在很多的框架中使用的也比较多,实例3,5见的就比较少,但是各有其用。

实例3,4都用于“调用函数并返回值”,这两种表达式有是那个括号,但是意义各不同。如图2,实例3的说明:

实例4的说明:

其实实例3,4基本是一致。但是它们的运算过程还是有不同:实例3是用强制运算符使函数调用运算得以执行,实例4则是用强制运算符运算“函数直接量声明”这个表达式,并返回一个函数 自身引用,然后通过函数调用运算符“()”,来操作这个函数的引用。

ps:“函数调用运算符()”在实例3中作用于匿名函数本身,而实例4中却是作用于一个运算的结果值。

最后的实例5,则用于“调用函数并忽略返回值”。运算符void用于使其后的函数表达式执行运算。然而由此带来的问题:如果不使用void和()这两个运算符,而直接使用下面的代码,是否能 使函数表达式执行呢?

// 实例6:直接使用调用函数运算符"()"
function () {// 函数体
}()// 实例7:使用语句结束符";"来执行语句
function () {// 函数体
}();

实例6,7看起来是right,但是事实上它们都不可以执行,原因是它们无法通过脚本引擎的语法检测。在语法检测阶段,脚本引擎会认为下面的代码:

function () {// 函数体
}// 或function fnName () {// 函数体
}

结果是函数声明,因此实例6,7中使用具名函数也是通不过语法检测的,正因为这里是函数声明,所有实例6,7的代码位于函数后面的“()”没有语法意义,它们的代码被解析成了

// 实例6:语法解释
function () {// 函数体
};
();// 实例7:同上

既然“function () {}”被当作完整的语法结构(函数声明语句)来解释,那么也就相当于已经存在语句结束符。因此“();”被当作一个语句表达式解释,而这样是错误的语法。所以,我们 能看到语法错误。

如此,这个语法错误是针对“();”,不是针对前面的函数声明的,下面代码稍作修改:

// 实例6:通过语法解释
function () {// 函数体
}(1,2)

这样就通过语法的解释, 因为语句被语法解释成了。

// 实例6:直接使用调用函数运算符"()"
function () {// 函数体
};
(1,2);

图4,被解释成了两个单值表达式,,也可以是单个单值表达式。但是这重要的是,这代码被解释成了一函数直接量声明和一个表达式语句,因此它不能起到“执行函数并传入参数”的作用。如果你真的想在声明的时候执行一下该函数,那么可以参考实例3,4,5,用“()”或void运算符将函数声明变成“单值表达式”

void function () {// 函数体
}(1,2);

当引擎在解释这样的代码时,由于先识别到运算符void,于是将后面的匿名函数识别为操作数。

上述就javascript中的函数调用语句,说实在的最后那个我也是看到书本上的,但是,我还是一直没太明白,如果那位高手可以指点其中的原委那就太感谢啦。也希望这个能帮到其他刚学习javascript的同学们。

转载于:https://www.cnblogs.com/qiheng/p/3506111.html

函数调用你知道几种方法相关推荐

  1. c语言调用graphviz_c语言分析函数调用关系图(call graph)的几种方法

    一.基于 Doxygen或 lxr 的API形式的文档系统. 二.基于CodeViz, CodeViz是<Understanding The Linux Virtual Memory Manag ...

  2. Javascript函数调用的四种方法

    2019独角兽企业重金招聘Python工程师标准>>> 一.方法调用模式 函数作为对象的属性时,称为方法.此时函数(即方法)中的this对应是该对象. var myObject = ...

  3. JS获取URL中参数值(QueryString)的4种方法分享

    http://www.jb51.net/article/48942.htm JS获取URL中参数值(QueryString)的4种方法分享 作者: 字体:[增加 减小] 类型:转载 今天碰到要在一个页 ...

  4. 算法导论中求解时间复杂度的三种方法

    这一章讲的是递归式(recurrence),递归式是一组等式或不等式,它所描述的函数是用在更小的输入下该函数的值来定义的. 本章讲了三种方法来解递归式,分别是代换法,递归树方法,主方法. 1.代换法( ...

  5. asp.net html 加密解密,三种方法还原ASP.NET可逆加密内容

    0x00 在进行安全测试的时候经常遇到ASP.NET平台的各类系统,它们加密手段有强有弱.有的只加密用户信息,有的则将数据库连接字串也进行了加密.以前不熟悉ASP.NET的时候有时解密一个连接字串都要 ...

  6. 重构-改善既有代码的设计:重新组织函数的九种方法(四)

    函数过长或者逻辑太混乱,重新组织和整理函数的代码,使之更合理进行封装. 1. Extract Method 提炼函数 提炼函数:(由复杂的函数提炼出独立的函数或者说大函数分解成由小函数组成) 你有一段 ...

  7. 嵌入式编程C语言提高代码效率的14种方法

    嵌入式编程C语言提高代码效率的14种方法 1.在可能的情况下使用typedef替代define.当然有时候你无法避免define,但是typedef更好. typedef int* INT_PTR; ...

  8. 线程间通信的三种方法 (转)

    http://www.cnblogs.com/puxidun/archive/2009/12/06/1618142.html 线程间通信的三种方法 多线程通信的方法主要有以下三种:  1.全局变量 进 ...

  9. 码code | 巧用2种方法,打破20条云开发数据库限制

    小程序·云开发是小程序的一种后端开发模式,能够帮助开发者快速构建微信小程序的后端服务,无需再搭建服务器. 然而熟悉云开发的开发者应该了解,即使云开发能基本满足小程序开发需求,但在数据获取上还是有所限制 ...

最新文章

  1. 倍福TwinCAT(贝福Beckhoff)基础教程5.1 TwinCAT-2 运行可执行文件
  2. 【VMware vSAN 6.6】2.1.带有本地存储的服务器:vSAN硬件服务器解决方案
  3. gbdt 算法比随机森林容易_用Python实现随机森林算法
  4. spoj SUBLEX (Lexicographical Substring Search) RE的欢迎来看看
  5. 提交日期表单状态操作_奇怪的知识又增加了,表单还能查寝?
  6. ibatis中#和$符号的区别
  7. 阅读一定时间后获得实现逻辑_大家都在好奇,18天读18本书的60分钟高效阅读,怎么这么火...
  8. 解决问题 xcrun: error: invalid active developer path
  9. 注意!这里手把手教你做数据运营管理
  10. 未能加载文件或程序集“****”或它的某一个依赖项。试图加载格式不正确的程序。解决方案总结...
  11. 什么是多线程,锁,死锁,怎么避免死锁(转)
  12. 网页播放器(CKplayer)的视频怎么下载——m3u8简单探索
  13. Servlet 运行工作原理详解
  14. python爬取千图网高清图
  15. 每次遇到浏览器主页被篡改的问题,就特别气愤加头疼
  16. directadmin php.ini 修改,DirectAdmin 更改服务器IP
  17. java丶对数组值按首字母进行排序
  18. PTA 循环结构 7-3 简写转全称
  19. 明年9月,南京大学苏州校区将正式招生!
  20. OSChina 周一乱弹 —— 论备份容灾的重要性

热门文章

  1. 4.10 风格代价函数
  2. R语言分类算法之随机森林(Random Forest)
  3. VCSA 6.7 U3部署(vCenter Server Appliance(VCSA)6.7 U3部署指南)
  4. Java基础学习总结(99)——Java代码性能优化总结
  5. linux内核创建字符节点,Tiny6410学习ing—(四)、嵌入式Linux内核驱动进阶—(7)、高级字符设备驱动(自动创建节点)—#931...
  6. matlab中gama,matlab积分结果中的gamma()函数参数问题,急求解答!!!
  7. android php实时聊天工具,Android_Android 应用APP加入聊天功能,简介 自去年 LeanCloud 发布实时 - phpStudy...
  8. 一篇文章带你熟悉 TCP/IP 协议-(三)
  9. 协同办公产品好不好用,得看这 25 项指标
  10. easyui tree 默认选中第一个元素