函数实际上是一个对象。每个函数都是Function 实例,而且都与其他引用类型一样具有属性和方法。由于函数也是对象,因此函数名实际上也是一个指向函数对象的指针。

函数定义方式

函数声明

function sum(num1, num2) {return num1 + num2;
}
复制代码

函数表达式

var sum = function(num1, num2) {return num1 + num2;
}
复制代码

Function 构造函数

var sum = new Function('num1', 'num2', 'return num1 + num2');
复制代码

注意:使用构造函数定义是不推荐的。因为这种语法会导致解析两次代码(第一次解析常规ECMAScript代码, 第二次是解析传入构造函数中的字符串),从而影响性能

函数声明与函数表达式的区别

  • 函数声明会首先被解析器读取,并使其在执行任何代码之前可以访问。如:
console.log(sum()) // 1
function sum() {return 1;
}
复制代码
  • 函数表达式则必须等到解析器执行到它所在的代码块,才会真正被解析器执行。如:
console.log(sum()) // sum is not a function
var sum = function () {return 1;
}
复制代码

没有重载

在创建两个同名函数时,后面的函数会覆盖了前面的函数。如:

function sum() {return 1;
}
function sum() {return 2
}
sum() // 2;
复制代码

作为值的函数

因为ECMAScript 中函数名本身就是变量,所以函数可以作为值来使用。也就是说,不仅可以像传递参数一样传递给另一个参数,也可以将一个函数做为函数返回值返回,如下:

function test(func, arg) {return func(arg)
}
function test2() {return function() {console.log('test2')}
}
复制代码

函数内部属性

arguments

arguments 是一个类数组的对象,返回值为函数的所有参数。这个对象还有另外一个属性callee,该属性是一个指针,指向arguments对象所在的函数的指针。举例说明:

// demo1.js
// 定义一个阶乘
function test(num){console.log('111')if(num <= 1){return 1;} else {return num * test(num - 1);}
}
test(5) // 120
// 将test函数赋值给另一个变量
var test2 = test// 我们再重新给test定义一个方法
var test = function() {return 0;
}
test2(5) // 0;
test(5) // 0
复制代码

再看下使用callee属性后是如何

// demo2.js
// 定义一个阶乘
function test(num){if(num <= 1){return 1;} else {return num * arguments.callee(num - 1);}
}
test(5) // 120
// 将test函数赋值给另一个变量
var test2 = test// 我们再重新给test定义一个方法
var test = function() {return 0;
}
test2(5) // 120;
test(5) // 0
复制代码

demo1.js 的代码我们为test重新定义了方法,原test变量的指向的指针发生了变化,所以返回重新定义方法的返回值。

this

this 引用的是函数执行的环境对象。但有些特殊的例外,如settimeout,setInterval等

caller

caller保存着调用当前函数的函数引用,如果是在全局作用域下调用,则返回null。如:

function outer() {inner()
}function inner() {console.log(inner.caller)
}
outer();
复制代码

以上代码为了实现松耦合,也可以通过arguments.callee.caller来访问。如:

function outer() {inner()
}function inner() {console.log(arguments.callee.caller)
}
outer();
复制代码

IE、firefox、chrome、safri 的所有版本以及opera9.6都支持caller属性。

当函数在严格模式下运行时,访问arguments.callee会导致错误。

ECMAScript 5 还定义了 arguments.caller 属性,但在严格模式下访问它也会导致错误,而在非严格模式下这个属性始终是undefined。定义arguments.callee属性是为了分清arguments.caller和函数的caller属性。以上变化为了加强这门语言的安全性,这种第三方代码不能在相同的环境里窥视其他代码了。

严格模式还有一个限制:不能为函数的caller属性赋值,否则会导致错误。

函数的属性和方法

属性

length length属性表示函数希望接收的命名参数的个数 prototype prototype 指向原型对象。包括诸如:toString()、valueof()等方法

方法

以下的方法都是改变函数的this指向的 call() call() 方法调用一个函数, 其具有一个指定的this值和分别地提供的参数(参数的列表)。 语法

fun.call(thisArg, arg1, arg2, ...)
复制代码

参数

参数 描述
thisArg 在fun函数运行时指定的this值。
arg1, arg2, ... 指定的参数列表。

返回值 返回值是你调用的方法的返回值,若该方法没有返回值,则返回undefined。 apply()

方法调用一个函数, 其具有一个指定的this值,以及作为一个数组(或类似数组的对象)提供的参数。

语法

fun.call(thisArg, [argsArray])
复制代码

参数

参数 描述
thisArg 在fun函数运行时指定的this值。
argsArray 可选的。一个数组或者类数组对象,其中的数组元素将作为单独的参数传给 func 函数。

返回值 调用有指定this值和参数的函数的结果。 bind() bind()方法创建一个新的函数, 当被调用时,将其this关键字设置为提供的值,在调用新函数时,在任何提供之前提供一个给定的参数序列。

语法

fun.bind(thisArg[, arg1[, arg2[, ...]]])
复制代码

参数

参数 描述
thisArg 当绑定函数被调用时,该参数会作为原函数运行时的 this 指向。当使用new 操作符调用绑定函数时,该参数无效。
arg1, arg2, ... 当绑定函数被调用时,这些参数将置于实参之前传递给被绑定的方法。

返回值 返回由指定的this值和初始化参数改造的原函数拷贝

如有侵权,请发邮箱至wk_daxiangmubu@163.com 或留言,本人会在第一时间与您联系,谢谢!!

长按二维码关注我们,了解最新前端资讯

【JS第15期】Function 详解相关推荐

  1. JS 中 valueOf() 方法的详解

    JS 中 valueOf() 方法的详解 JavaScript 中的 valueOf() 方法用于返回指定对象的原始值,若对象没有原始值,则将返回对象本身.通常由JavaScript内部调用,而不是在 ...

  2. node mysql 查询_Node.js使用mysql进行查询详解

    本篇教程介绍了Node.js使用mysql进行查询详解,希望阅读本篇文章以后大家有所收获,帮助大家对Node.js的理解更加深入. < 因为返回的是个对象 var selectSql1=&quo ...

  3. js中小括号()的用法详解

    一.js中小括号()的用法详解 1.作为分组运算符: 分组运算符应该是再熟悉不过了,因为在小学数学中就有应用,例如: var a=(1+2)*4; console.log(a); 以上代码的输出值是1 ...

  4. js购物车功能php,使用JS实现购物车功能步骤详解

    这次给大家带来使用JS实现购物车功能步骤详解,使用JS实现购物车功能的注意事项有哪些,下面就是实战案例,一起来看一下. 我们肯定都很熟悉商品购物车这一功能,每当我们在某宝某东上购买商品的时候,看中了哪 ...

  5. html5局部放大图片,js实现图片局部放大效果详解

    图片局部放大效果结合的知识点主要是DOM的操作,以及事件的应用,所以首先要对DOM的操作有一定了解,其次能对事件的应用有一定的累积. 如上图,可以看到,这是放大镜的基本效果,主要分成左右两个部分.左边 ...

  6. JS es6的Class类详解

    文章目录 JS es6的Class类详解 class基本语法 Class的基本语法之constructor Class的基本语法之类的调用方式 Class的基本语法之getter和setter Cla ...

  7. 机器学习(十九)——PageRank算法, KNN, loss function详解

    http://antkillerfarm.github.io/ PageRank算法 概述 在PageRank提出之前,已经有研究者提出利用网页的入链数量来进行链接分析计算,这种入链方法假设一个网页的 ...

  8. js showModalDialog参数的使用详解(转)

    js showModalDialog参数的使用详解_javascript技巧_脚本之家 http://www.jb51.net/article/45281.htm 本篇文章主要是对js中showMod ...

  9. [js]JavaScript Number.toPrecision() 函数详解

    [js]JavaScript Number.toPrecision() 函数详解 JavaScript: numberObject.toPrecision( [ precision ] ) 如果没有提 ...

  10. 计算机中的光学知识,科学网—光学基础知识大讲堂 ——第3期:详解电磁辐射 - 何卓铭的博文...

    光学基础知识大讲堂 --第3期:详解电磁辐射 何卓铭 电磁辐射作为一种看不见.摸不着的场,是电磁波能量传递的一种方式.而我们生活着的地球环境中,便充斥着大量的电磁辐射,不过不用害怕,只有当电磁辐射达到 ...

最新文章

  1. 在CentOS 6.3 64bit上安装tsar并监控Apache Traffic Server
  2. 改变Repeater控件中按钮颜色
  3. 6.2 K-Means 算法步骤-机器学习笔记-斯坦福吴恩达教授
  4. OpenV P N + AD(Ldap) + GoogleAuth认证安装
  5. Minimum Possible LCM
  6. linux编译安装madam,linux 下 使用 mdadm 创建阵列
  7. Influxdb修改数据保留策略
  8. 用Navicat连接Oracle数据库时报错ORA-28547:connection to server failed,probable Oracle Net admin error
  9. 半监督学习的概述与思考,及其在联邦场景下的应用(续)
  10. Protostuff序列化和反序列化
  11. IDEA 导入项目中文注释乱码如何解决
  12. C语言:复制线性链表(递归)算法
  13. 什么是无穷:康托超穷数理论简评
  14. 常用U盘量产工具下载
  15. Robot Rapping Results Report CodeForces - 645D
  16. MTK处理器心路历程
  17. 大数据文字游戏_什么是大数据?
  18. 工作了一辈子,你的住房公积金一共能有多少钱?
  19. jquerymobile-16 select menu
  20. 长在火山熔岩石板地上的大米

热门文章

  1. 禁用计算机上的所有鼠标加速,鼠标加速,小编告诉你鼠标加速怎么关
  2. 2019暑期总结规划
  3. 一串数字,从第一个开始走,第一步可以走1到length/2步长,后面每一步步长就是对应的数值,如果能走到最后一个数,就输出走的步数,否则输出-1
  4. IDEA查看调用方法代码上一步和下一步
  5. Card Trick
  6. duilib.dll丢失怎么办?dll文件丢失修复方法分享
  7. 美国的儿童新娘:这世界的黑暗,又何止RYB?
  8. 「深圳的房价」是否会达到每个人想要的水平?
  9. java(11):tomcat简介与使用(上)
  10. 能上QQ,却不能浏览网页的解决办法