共有四种绑定规则。
1.默认绑定
函数在调用的时候,没有给它绑定任何的就是作为独立函数来使用的。
例一:
例二:
例三:
2.隐式绑定
通过某个对象进行调用,也就是它的调用位置中,是通过某个对象发起的函数调用,让它作为某个对象的方法进行调用。
隐式绑定有一个前提条件:必须在调用的对象内部有一个对函数的引用(比如一个属性)
正是通过这个引用,间接的将this绑定到了这个对象上。
例一:
例二:
3.显式绑定
1)call和apply方法
如果不希望在对象内部包含这个函数的引用,同时又希望在这个对象上进行强制调用,就需要使用JavaScript所有的函数都可以使用的call和apply方法(这个和Prototype有关)
call和apply都可以调用函数:
这三种都能够调用函数,直接调用函数和使用这两种方式调用函数的区别在于this绑定的不同。
foo直接调用指向的是全局对象(window)。
call和 apply的区别:
它们两个传递参数的格式不太一样。
call是直接在括号里,以逗号为间隔传递参数;apply是需要将这些参数放进数组中加以传递。
call和apply在执行函数时,是可以明确绑定this的,这个绑定规则称之为显示绑定。
2)bind显示绑定
如果想要多次调用下面的这个foo函数,且需要将this绑定为aaa,那么下面的写法会比较繁琐,可以使用bind直接一次性绑定在aaa上。
bind绑定:
可以看到上述代码中,调用函数是直接调用的,但是已经使用bind绑定过了,这个时候其实存在一个默认绑定和显示绑定bind的冲突,是有优先级的,显示绑定优先于默认绑定。
如果想要在后面传递参数,是和call是一样的。
也就是bind绑定了之后赋值newFoo,这个newFoo是一个新的函数对象,和原来的foo不是一块内存空间。
4.new绑定
JavaScript中的函数可以当做一个类的构造函数来使用,也就是使用new关键字。
使用new关键字来调用函数时,会执行下面的操作:
- 创建一个全新的对象
- 这个新对象会被执行prototype连接(原型连接)
- 这个新对象绑定到函数调用的this上(this的绑定在这个步骤完成)
- 如果函数没有返回其他对象,表达式会返回这个新对象
代码解释上述概念性的内容: