- 作为函数直接被调用时 this 绑定到全局对象,在浏览器中,该全局对象为window
- 函数嵌套产生的内部函数的 this不是父函数,仍然是全局变量
- setTimeout、setInterval:这两个方法执行的函数中的 this 也是全局变量,但是如果这两个方法中的函数是箭头函数,则 this 指向 setTimeout 上一级的 this
- 函数如果作为对象的方法调用,this 会绑定到该对象上,如果将该对象的方法赋给另一个变量,那么这个方法中的 this 就另当别论了
var fn2 = obj1.fn;
fn2() //函数中的this此时指向window
- DOM对象绑定事件时,this指向当前绑定对象(e.currentTarget),而在jQuery中如果使用事件代理,this 指向的是触发事件的元素(绑定元素的子元素)
- Function.prototype.bind:返回一个新函数,函数中的this指向传递给bind的第一个参数
function fn(){
var name='abc';
console.log(this.name)
}
var obj = {name:'def'};
var fn2 = fn.bind(obj);
fn2() // 'def'
- call 具有与 bind 相似的用法,也是用来改变 this,它接受列表参数,不过call()后函数会立刻执行,第一个参数是想传入的数据值,为 arguments 格式,后面的参数为需要传递给函数的参数
用法:.call(context,para1,para2...)
var argsArr = Array.prototype.slice.call(arguments,0)
// 将数组的 slice 方法用在 arguments 上,使 arguments 转化为数组
- apply与 call 用法相似,它接受数组参数,让数组参数能够使用列表参数才能使用的方法
用法:.apply(context,paraArray)
Math.max(1,2,3,4) // 4;
Math.max.apply(null,[1,2,3,4]) // 4
- 箭头函数中没有this,所以其内部的 this 指向它上一级的 this