this对象

函数的 this 关键字在 JavaScript 中的表现略有不同,此外,在严格模式和⾮严格模式之间也

会有⼀些差别

在绝⼤多数情况下,函数的调⽤⽅式决定了 this 的值(运⾏时绑定

this 关键字是函数运⾏时⾃动⽣成的⼀个内部对象,只能在函数内部使⽤,总指向调⽤它的对象

默认绑定

全局环境中定义 person 函数,内部使⽤ this 关键字

隐式绑定

函数还可以作为某个对象的⽅法调⽤,这时 this 就指这个上级对象

new绑定

•通过构建函数 new 关键字⽣成⼀个实例对象,此时 this 指向这个实例对象

显⽰绑定

apply()、call()、bind() 是函数的⼀个⽅法,作⽤是改变函数的调⽤对象。它的第⼀个参数就

表⽰改变后的调⽤这个函数的对象。因此,这时 this 指的就是这第⼀个参数

bind、call、apply 区别?如何实现⼀个bind?

apply 接受两个参数,第⼀个参数是 this 的指向,第⼆个参数是函数接受的参数,以数组的形式

传⼊

改变 this 指向后原函数会⽴即执⾏,且此⽅法只是临时改变 this 指向⼀次

call ⽅法的第⼀个参数也是 this 的指向,后⾯传⼊的是⼀个参数列表

跟 apply ⼀样,改变 this 指向后原函数会⽴即执⾏,且此⽅法只是临时改变 this 指向⼀次

bind改变 this 指向后不会⽴即执⾏,⽽是返回⼀个永久改变 this 指向的函数

⼩结

从上⾯可以看到, apply 、 call 、 bind 三者的区别在于:

三者都可以改变函数的 this 对象指向

三者第⼀个参数都是 this 要指向的对象,如果如果没有这个参数或参数为 undefined 或

null ,则默认指向全局 window

三者都可以传参,但是 apply 是数组,⽽ call 是参数列表,且 apply 和 call 是⼀次性传⼊

参数,⽽ bind 可以分为多次传⼊

bind 是返回绑定this之后的函数, apply 、 call 则是⽴即执

事件与事件流

javascript 中的事件,可以理解就是在 HTML ⽂档或者浏览器中发⽣的⼀种交互操作,使得⽹⻚

具备互动性, 常⻅的有加载事件、⿏标事件、⾃定义事件等

由于 DOM 是⼀个树结构,如果在⽗⼦节点绑定事件时候,当触发⼦节点的时候,就存在⼀个顺序问

题,这就涉及到了事件流的概念

事件流都会经历三个阶段:

事件捕获阶段(capture phase)

处于⽬标阶段(target phase)

事件冒泡阶段(bubbling phase

事件代理

事件代理,俗地来讲,就是把⼀个元素响应事件( click 、 keydown ……)的函数委托到另⼀个元

前⾯讲到,事件流的都会经过三个阶段: 捕获阶段 -> ⽬标阶段 -> 冒泡阶段,⽽事件委托就是在冒泡

阶段完成

事件委托,会把⼀个或者⼀组元素的事件委托到它的⽗层或者更外层元素上真正绑定事件的是外层

元素,⽽不是⽬标元素

当事件响应到⽬标元素上时,会通过事件冒泡机制从⽽触发它的外层元素的绑定事件上,然后在外层

元素上去执⾏函数