这是我参与「第四届青训营 」笔记创作活动的第1天
什么是函数?
- 实现特定功能的n条语句的封装体
- 只有函数是可以执行的,其他的数据类型不能执行
为什么用函数?
-
提高代码复用
-
便于阅读
如何定义函数?
- 函数声明
- 表达式
如何调用函数?
- 直接调用 _test()
- 通过对象调用 obj.test()
- new调用 new test()
- 临时让test成为obj的方法进行调用
- test.call/apply(obj) 等同于 obj.test()
- test函数中的this指向obj
1.回调函数
1.1什么是回调函数?
-
定义了
-
没有调用
-
某个时刻或某个条件下最终执行了
1.2常见回调函数?
-
dom事件回调函数
- this是发生事件的dom元素
-
定时器回调函数
- this是window
-
ajax请求回调函数
-
生命周期回调函数
2.立即执行函数IIFE
2.1作用
- 隐藏实现
- 不会污染外部(全局)命名空间
- 用来编码js模块
3.函数中的this
3.1this是什么?
-
任何函数本质上是一个对象调用的,若没有直接指定对象则为window
-
所有函数内部都有一个变量this
-
他的值是调用函数的对象
3.2如何确定this的值
-
test()
- window
-
obj.test()
- obj
-
new test()
- new出来的对象
-
p.call(obj)
- obj
4.函数高级之原型
4.1函数中的prototype属性
- 每个函数都有一个prototype属性,默认指向一个空Object实例对象(即原型对象)
- 原型对象中有一个constructor属性,指向函数对象
4.2给函数对象添加属性(一般是方法)
- 作用:函数的所有实例对象自动拥有原型中的属性和方法
4.3显示原型和隐式原型
- 显示原型属性
- 每个函数function都有一个prototype,即显示原型,默认指向一个空的Object对象,即显式原型
- function Fn() {} // 内部语句:this.prototype = {}
- 隐式原型属性
- 每个实例对象都有一个__proto__,即隐式原型
- let fn = new Fn() // 内部语句:this.proto = Fn.prototype 实例对象的隐式原型为对应构造函数的显示原型的值
4.4总结
- 函数的prototype属性
- 在定义函数时自动添加的,默认值是一个空Object对象
- 对象的__proto__属性
- 创建对象时自动添加的,默认值是构造函数的prototype属性
- 程序员可以直接操作显式原型,但不能操作隐式原型(ES6之前)
- 实例对象的隐式原型的指向等于构造函数的显示原型