在Javascript中,this指向函数执行时的当前对象。值得注意,该关键字在Javascript中和执行环境,而非声明环境有关。 这里的重点是执行时。 eg: function aa(){
在Javascript中,this指向函数执行时的当前对象。值得注意,该关键字在Javascript中和执行环境,而非声明环境有关。
这里的重点是执行时。
eg:
function aa(){ console.log(this); // 现在不能确定this指针所指向的对象。你会说window?}aa(); // 这时候的确是windowvar bb = {aa: aa}bb.aa() // 返回的就是Object了var aaa = bb.aa;aaa() //那么这时候this又变成window了
理解了this的指向,那么我们讨论一下call和apply 的用法,其实两个是一样的,只不过参数传递形式不同,在这里就不讨论了。
call和apply能够强制改变函数执行时的当前对象,让this指向其他对象。拿apply做例子。
var name = 'window';var aa = function(){console.log(this.name)};aa() // windowvar bb = {name:'javascript',aa:aa}bb.aa() // javascript 验证了之前this的定义bb.aa.apply(this) // window 又变成了window
bb.aa()方法中this本来是指向对象bb的,apply修改了bb.aa()方法中this的指向,指向了window。理解了this,apply就自然懂了。
apply常见用法:
1. 偷取方法。
function aa(){//获取第一个参数return arguments[0];}aa(1, 2, 3)//在JavaScript中,arguments对象是比较特别的一个对象,实际上是当前函数的一个内置属性。arguments非常类似Array,但实际上又不是一个Array实例//上述的方法只能获取一个,如果我想截取一段呢?用Array对象的splice方法多好,是吧?function aa(){ // return arguments.splice(1,2) 会报错的,arguments是对象,没有splice方法return Array.prototype.splice.apply(arguments,[1 ,2]); }aa(1, 2, 3) //[2, 3] 把数组对象的方法偷过来了吧、、、