函数对象

当我们对函数使用 typeof 操作符会返回什么?

function f() {
console.log('hello')
} console.dir(typeof f) // function

实际上函数是一种特殊的 JavaScript 对象。由于函数是对象,所以它也有属性和方法,甚至还可以使用 Function() 构造函数创建新函数对象。

函数对象属性

自有属性

属性名 作用
length 属性表示函数的参数列表中的参数个数。
name 属性表示定义函数时使用的名字,如果是未命名的函数则为匿名函数。
prototype 属性是函数对象的原型对象,每个函数都有自己的原型对象,当函数被作为构造函数使用是,新创建的对象从这个原型对象继承属性。

自定义属性

执行f.count = 0不是在函数内定义一个局部变量 count 。换句话说,函数属性和变量是毫不相关的两个东西。

函数是一种特殊的对象,可以在它里面添加属性,而且对它的执行没有任何影响。因此,可以将自定义属性缓存到函数对象中,而这个属性只有函数自己会用到。

function f() {
console.log('hello')
f.count++
}
f['count'] = 1 // 自定义函数属性
f() // 执行函数
f() // 执行函数
console.log(`调用次数: ${f.count}`) // 2

函数方法

call()

call() 和 apply() 允许为不同的对象分配和调用属于一个对象的函数,提供新的 this 值给当前调用的函数。

let o = {
print: function(date) {
console.log(`Time: ${date} | ${this.name} 说:${this.content}`)
}
} let a = {
name: 'xiaoming',
content: '今天天气真好!'
} let b = {
name: 'xiaohong',
content: '今天天气一般!'
} o.print.call(a, new Date().getHours()) // Time: 22 | xiaoming 说:今天天气真好!
o.print.call(b, new Date().getHours()) // Time: 22 | xiaohong 说:今天天气一般!

call() 和 apply() 类似于 Java 一样,子类继承父类,并调用父类方法。

bind()

bind() 方法可以把函数绑定到对象上。如果在函数 func 上调用 bind() 方法并传入对象 o ,则这个方法会返回一个新函数,这个函数就像是 func 函数一样。

function func(y) {
return this.x + y
} let o = {
x: 1
} let bindFunc = func.bind(o)
console.log(bindFunc(10)) // 11

绑定完成之后,再将这个函数作为另一个对象的属性:

let p = {
x: 10,
bindFunc
} console.log(p.bindFunc(10)) // 20

说明 bindFunc 依旧绑定的是对象 o 。

函数的构造器

函数本质是对象,而它的构造函数是 Function() ,可以用来创建函数:

const f = new Function('x', 'y', 'return x * y')

最新文章

  1. ES6笔记(1) -- 环境配置支持
  2. 清北学堂模拟day6 圆桌游戏
  3. easylui datagrid 动态生成列
  4. 深入理解ServletRequest与ServletResponse
  5. 自己制作 SPx N合1 自动安装盘(x86)
  6. OS X Git连接github
  7. CMD命令查询DNS服务器
  8. hdu 1011 Starship Troopers(树形DP入门)
  9. django之数据库orm
  10. Java面向对象(二、继承)
  11. 【redis】在dotnet core下的redis的使用
  12. Javascript我学之四作用域
  13. JAVA新的一天
  14. AWK入门
  15. springboot + mybatis配置分页插件
  16. yum update软件包冲突
  17. Android手机间无线互传功能探索及实现
  18. 为 Apache 配置 UTF-8 中文编码
  19. 对React children 的深入理解
  20. Python学习笔记015——文件file的常规操作(二进制文件)

热门文章

  1. Web自动化定位方法以及常用便捷操作
  2. LoRa和NB-IoT会长期共存吗?
  3. SQL注入漏洞篇
  4. python新建一个目录
  5. bat-配置环境变量
  6. 我用Python做了一个咖啡馆数据分析
  7. Linux YUM 配置源
  8. NC13822 Keep In Line
  9. 爬虫(14) - Scrapy-Redis分布式爬虫(1) | 详解
  10. Idea 的Test测试报错:java.lang.IllegalStateException: Failed to load ApplicationContext