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 ……)的函数委托到另⼀个元
素
前⾯讲到,事件流的都会经过三个阶段: 捕获阶段 -> ⽬标阶段 -> 冒泡阶段,⽽事件委托就是在冒泡
阶段完成
事件委托,会把⼀个或者⼀组元素的事件委托到它的⽗层或者更外层元素上,真正绑定事件的是外层
元素,⽽不是⽬标元素
当事件响应到⽬标元素上时,会通过事件冒泡机制从⽽触发它的外层元素的绑定事件上,然后在外层
元素上去执⾏函数



