著作权归该书作者所有。本读书笔记仅供个人记录学习使用,如若侵权,请通知到我,我将立即删除全部内容。
this、call和apply
JavaScript的this总是指向一个对象,而具体指向哪个对象是在运行时基于函数的执行环境动态绑定的。
除去不常用的with和eval的情况,this的指向大致分4种
- 作为对象的方法调用
- 作为普通函数调用
- 构造器调用
- Function.prototype.call或Function.prototype.apply调用
1.当函数作为对象的方法调用,this指向该对象:
1 | var obj = { |
2.当函数作为普通函数被调用,不作为对象的属性被调用,此时this指向全局对象,即window对象
1 | window.name = "globalName"; |
3.构造器调用
大部分JavaScript函数都可以当做构造器使用,构造器的外表和普通函数一样,区别在于被调用的方式。当用new运算符调用函数时,该函数总会返回一个对象,通常情况下构造器里的this就指向返回的这个对象。
1 | var MyClass = functio(){ |
4.Function.prototype.call 或 Function.prototype.apply
1 | call() 方法在使用一个指定的this值和若干个指定的参数值的前提下调用某个函数或方法. |
call与apply的区别
在ECMAScript3中给Function的原型定义了两个方法,Function.prototype.call 和Function.prototype.apply,作用相同,仅仅是传入参数形式不同。
apply接受两个参数,第一个参数指定了函数体内this对象的指向,第二个参数为一个带下标的集合,这个集合可以是数组,也可以是类数组,apply方法把这个集合中的元素作为参数传递给被调用的函数:
当使用call或apply的时候,如果传入的第一个参数为null,函数体内的this会指向默认的宿主对象,即window
var func = function(a,b,c){
console.log([a,b,c]);
}
func.apply(null,[1,2,3]); //[1,2,3]
有时使用call或apply的目的不在于指定this,而是借用其他对象的方法,那我们可以传入null来替代某个具体对象
Math.max.apply(null,[1,2,5,3,4]); //5
call和apply的用途
1.改变this的指向
1 | var obj1 ={ |
- this被不经意改变的场景:比如有一个div节点,div节点的onclick事件中的this本来指向该div
1 | document.getElementById("div1").onclick = function(){ |
2.Function.prototype.bind 用来指定函数内部的this指向
1 | Function.prototype.bind = function(context){ |
3.借用其他对象的方法
一、借用构造函数
1 | var A = function(name){ |