正文:我们知道,在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并未指向任何一个函数,因此在之前调用函数则会报错。

转载于:https://www.cnblogs.com/libin-1/p/5961020.html

Js函数function基础理解相关推荐

  1. java js中 function函数报错_浅析JS中对函数function的理解(基础篇)

    正文:我们知道,在js中,函数实际上是一个对象,每个函数都是Function类型的实例,并且都与其他引用类型一样具有属性和方法.因此,函数名实际上是指向函数对象的指针,不与某个函数绑定.在常见的两种定 ...

  2. js 函数function用法

    javascript 函数不同于其他的语言,每个函数都是作为一个对象被维护和运行的.通过函数对象的性质,可以很方便的将一个函数赋值给一个变量或者将函数作为参数传递.在继续讲述之前,先看一下函数的使用语 ...

  3. js函数(function)

    函数其实就是抽取写好的js代码,作为一个通用的代码块 作用:减少代码冗余,方便调用(提高效率),便于维护 //js有哪些函数(带括号的就是函数) 1.系统函数 系统自带的函数例如:alert()2.内 ...

  4. Ext.NET加入自定义验证JS函数

    ExtJS验证很方便,在使用FormPanel的时候,我们可以很方便的进行验证.比如设置必填项.正则.字段类型等等.比如如下所示: 上面的验证是这么写的: <Listeners><C ...

  5. html的弹窗标签是什么意思,前端实现展示弹窗,为什么不同的标签弹出相同的内容?是不是js函数写错了,需要怎么改呢?...

    Fisrt First First Second Second Second js函数 $(function(){ }) function openDialog(){ document.getElem ...

  6. js中(function(){…})()立即执行函数写法理解

    js中(function(){-})()立即执行函数写法理解 javascript和其他编程语言相比比较随意,所以javascript代码中充满各种奇葩的写法,有时雾里看花,当然,能理解各型各色的写法 ...

  7. # vue.js 之 对vue.js基础理解

    vue.js 之 对vue.js基础理解 Vue构造器 1 . Vue.js是一个构造函数,编程中称之为构造器 2 . 每一个new Vue() 都是一个Vue构造函数的实例,这个过程叫做实例化 3 ...

  8. JS基础,从JS的组成到JS函数写法

    一.计算机的组成 计算机|--软件|--硬件|---输入设备|---输出设备|---CPU|---硬盘|---内存 二.JS的组成 1.ECMAScript 是由ECMA国际(原欧洲计算机制造商协会) ...

  9. 100多个基础常用JS函数和语法集合大全

    网站特效离不开脚本,javascript是最常用的脚本语言,我们归纳一下常用的基础函数和语法: 1.输出语句:document.write(""); 2.JS中的注释为// 3.传 ...

最新文章

  1. mysql代码不熟_mysql存储过程的错误,语法不熟,找了好久没找到错误。。。
  2. 充分利用 UE4 中的噪声
  3. lisp 回执多段线_多段线上加点的LISP程序源码
  4. 实体和电商哪个更能赚到?
  5. 不打好评不给用!苹果竟然把这种“流氓” App 都放出来?
  6. mysql切换二进制日志命令_Mysql二进制日志binlog命令
  7. Eclipse 插件 在线安装 收集
  8. java多线程实现卖票小程序
  9. python清空屏幕代码_python 清屏
  10. 未明学院:云计算热门机器学习项目来袭!收割亚马逊、阿里等一众巨头都看重的实操技能与项目经历!
  11. 将win10输入法设置为默认美式键盘且用shift+ctrl切换
  12. 随笔20220717
  13. 【高频内存与主板内存频率和CPU内存频率之间的关系】
  14. 转《七年之前和七年之后》-祭奠高考
  15. 科学计算机解三角函数方程,用科学计算器解方程 急!!!
  16. Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码)
  17. 首次授权中国区独立维修商,高冷的苹果也为“五斗米“折腰?
  18. UTF8 中文占几个字节
  19. 2018ICPC徐州赛区网络预赛
  20. as 运行java 程序失败,为JBoss AS 7运行Java服务包装程序时出错

热门文章

  1. 【机器视觉】 dev_display算子
  2. 【MFC】定义XP风格的工具栏
  3. 【C++】error C2275 “XXXX” 将此类型用作表达式非法
  4. 【STM32】ESP8266模块简介
  5. 【Linux】一步一步学Linux——batch命令(134)
  6. 【Linux网络编程】原始套接字实例:发送 UDP 数据包
  7. 攻击 xxs_“吃鸡”又出现1招炸队友不受惩罚,xxs乐坏了,请别手误打载具
  8. Jfinal 对象列表返回前台json数据
  9. 实现strlen()(c语言)
  10. LVS(4)——规则相关操作