正文:我们知道,在js中,函数实际上是一个对象,每个函数都是Function类型的实例,并且都与其他引用类型一样具有属性和方法。因此,函数名实际上是指向函数对象的指针,不与某个函数绑定。在常见的两种定义方式(见下文)之外,还有一种定义的方式能更直观的体现出这个概念:

var sum = new Function("num1", "num2", "return num1 + num2"); //不推荐

Function的构造函数可以接收任意数量的参数,但最后一个参数始终被看做函数体。这种方式有个缺点是,会导致解析两次代码,第一次是基础的ES代码解析,第二次是解析传入构造函数中的字符串,这样会导致性能的下降,在此写出是帮助理解js中函数其实是对象这个概念。

(一)js函数没有重载的概念

说到重载的概念,我们来类比Java中的重载是怎么实现的:在Java中,方法是通过方法签名来唯一标识一个方法。方法签名包括:方法名、参数数量、参数顺序和参数类型这几个要素。因此两个方法的方法名相同,而其他签名要素不同,编译器就会认为是两个不同方法,从而可以存在同名的不同方法,以实现重载的概念。(引用:怎么深入理解js中为什么没有重载呢--segmentfault 中manxisuo的回答)。

而上面我们说过,js中的函数名实际上是指向函数对象的指针,因此函数名可以说是一个函数的唯一标识,跟参数列表并没有关系,因此并不会出现同名的两个函数(因为一个指针同时只能指向一个对象)从而不存在重载的概念。 举个栗子:

function sum(num1, num2){

return num1 + num2;

}

function sum(num1, num2, num3){

return num1 + num2 + num3;

}

上面这种可以换一种写法,会更直观一些:

var sum = function(num1, num2){

return num1 + num2;

}

sum = function(num1, num2, num3){

return num1 + num2 + num3;

}

这样就很明显可以看出,上面一行将sum指向function(num1,num2),而接下来又将sum指向function(num1, num2, num3),从而造成第二次的指向覆盖了第一次的,因此更明显的看出js中并没有重载的概念。

(二)函数声明和函数表达式的区别

我们知道,常用的定义函数方法有两个:函数声明和函数表达式。

函数声明,可以说是最常见的定义方法,如下例:

function sum(num1, num2){

return num1 + num2;

}

函数表达式,这种定义方式在闭包及一些框架中使用较多,例如angular中常见的$scope.doSomething = function(){...}:

sum = function(num1, num2){

return num1 + num2;

};

上述两种定义方法几乎是相同的,但有一点小区别,请看下面这个例子:

//函数声明

alert(sum(100, 100));

function sum(num1, num2){

return num1 + num2;

}

//函数表达式

alert(sum(100, 100));

var sum = function(num1, num2){

return num1 + num2;

};

这两段代码看起来差别不大,只是函数定义的方式不同而已。但事实是,第一段可以正常运行而第二段则会报错。这是因为,在代码开始执行之前,解析器就已经通过一个名为函数声明提升的过程,读取并将函数声明添加到执行环境中。简单来说,解析器会先将函数声明放在源代码树的顶部。而下面那段代码,函数位于一个初始化语句中(并不会将其提升到顶部),简单来说,在执行到这个赋值语句之前,sum并未指向任何一个函数,因此在之前调用函数则会报错。

以上所述是小编给大家介绍的JS中函数function的理解(基础篇),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

java js中 function函数报错_浅析JS中对函数function的理解(基础篇)相关推荐

  1. mysql cast报错_在mysql中使用cast函数报错

    今天遇到在使用mysql的cast函数报错的问题,这个函数的意思是把当前的字段转成某种类型的字段,我使用cast(xxxx as int) 这种方式,但是发现报错了,查阅资料发现 参考这个百度,总结来 ...

  2. 安装32位mysql报错_在CentOS中安装32位或64位MySql报错error: Failed dependencies解决办法...

    在CentOS中安装MySql报错error: Failed dependencies解决办法 安装64位MySql报错内容如下: error: Failed dependencies: libaio ...

  3. python下载库报错_下载python中Crypto库报错:ModuleNotFoundError: No module named ‘Crypto’的解决...

    下载python中Crypto库报错:ModuleNotFoundError: No module named 'Crypto'的解决 前言 最近在网上找了很多下载Crypto的方法,感觉作用都不算很 ...

  4. 中引入文件报错_关于前端开发中的模块化

    前端开发离不开模块化,与模块化有关的关键字有以下几个: require/module.exports export/import define/require/exprots define/seajs ...

  5. vs中imshow函数报错_Win7下VS2010中配置Opencv2.4.4的方法(32位和64位都有效)(亲测成功)...

    在vs2010下配置opencv是件痛苦的事情,一点点错误可能就会导致莫名其妙的报错,各种error让人郁闷不已,这里提供给大家一篇vs2010下配置opencv2.4.4的方法,我是64位的win7 ...

  6. thymeleaf 使用页面报错_异常处理-SpringBoot中thymeleaf对应前台页面大于号\小于号使用问题...

    浏览器报错信息: There was an unexpected error (type=Internal Server Error, status=500). Exception parsing d ...

  7. java打开别人的代码报错_同样的代码,别人的可以运行我的报错,求解答

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 public class Override { public static void main(String[ ] args) { //创建两个实例 Ca ...

  8. python import random 报错_导致python中import错误的原因是什么

    Python程序可以调用一组基本的函数(即内建函数),比如print().input()和len()等函数.Python本身也内置一组模块(即标准库).每个模块都是一个Python程序,且包含了一组相 ...

  9. python中map函数字典映射_浅析python中的map函数

    1.map()函数的简介以及语法: map是python内置函数,会根据提供的函数对指定的序列做映射. map()函数的格式是:map(function,iterable,...) 第一个参数接受一个 ...

最新文章

  1. java静态链表_数据结构笔记:静态链表(C语言)
  2. mysql创建存储过程权限问题
  3. AD9833所产生的高频信号质量分析
  4. 导入excel文件处理流程节点的解决方案
  5. poj 3308(最小割求解最小点权覆盖)
  6. 1.1 一个简单的脚本
  7. Java Hashtable rehash()方法与示例
  8. JavaEE实战班第13天
  9. 正则表达式表示的IP
  10. 蓝桥杯 ADV-201 算法提高 我们的征途是星辰大海
  11. 大规模中文自然语言处理语料(百科,问答、新闻,翻译)
  12. react-native 无网络提示_win7系统无线网络提示ipv4无访问权限怎么解决【解决方法】...
  13. linux去除内容重复行,实例详细说明linux下去除重复行命令uniq
  14. fdisk硬盘分区(1)——系统盘剩余空间创建分区
  15. 2018Oracle11g下载与安装菜鸟教程(二)
  16. 下载Android5.1源代码
  17. Vue项目实战——实现一个任务清单【基于 Vue3.x 全家桶(简易版)】
  18. 记事正文 - QQ邮箱
  19. 曲线救国使用图片url
  20. Java内存区域与OutOfMemoryError

热门文章

  1. 前端学习(270):百度弹性导航
  2. spring学习(47):bean的作用域
  3. 第三十一期:世界上有四类人永远不可能成为编程界牛人(个人见解,欢迎补充)
  4. Python time localtime()方法
  5. Loopback Address
  6. python中空位符_python中空位符_Python之路 - Python - 字符编码 - 期权论坛
  7. 互联网大佬学历背景大揭秘,看看是你的老乡还是校友
  8. IP通信基础 4月28号
  9. Python模块学习
  10. MySQL -- SQL 语句