this指向
1.this
在每一个函数中,都有一个内置的变量 this。大部分情况下,这个this存储是当前函数的调用者。this的指向在函数定义的时候是确定不了的。只有函数执行的时候才能确定this到底指向谁。
2.几种情况
1.全局变量中指向window
function show(){
console.log(this);//window
}
show()
2.在对象的方法中指向调用者
var o = {
a:10,
b:{
a:12,
fn:function(){
console.log(this.a);//12
}
}
}
o.b.fn();
var o = {
a:10,
b:{
a:12,
fn:function(){
console.log(this.a);//undefined
console.log(this);//window
}
}
}
// o.b.fn();
var j = o.b.fn;
window.j();
3.在事件绑定中,指向目标对象。
var box = document.getElementById("box");
box.onclick = function(){
console.log(this);
}
4.定时器处理函数中,指向window
var obj = {
a: 10,
b: {
a: 20,
fn: function() {
console.log(this.a);//undefined
console.log(this);//window
}
}
}
setTimeout(obj.b.fn, 1000);
3.强行改变this指向
3.1 call()
格式:
函数名.call(obj,arg...);
//obj : 函数内部的this指向
//arg...:从第二个参数开始,为函数的参数。
function fn(a, b) {
console.log(this);//obj
console.log(a + b);
}
var obj = {}
fn.call(obj, 10, 20)
特点:
立即执行当前函数。
【注意】定时器处理函数或者事件处理函数不适用
3.2 apply()
格式:
//obj : 函数内部的this指向
//arr:一个数组或者伪数组,里面的每一个元素会依次传递给函数。
函数名.apply(obj,arr);
特点:
立即执行当前函数。
【注意】定时器处理函数或者事件处理函数不适用
** 应用:**可以以数组的形式给某些功能函数传参。
var arr = [10,5,30,-15,6,40]
// var max = Math.max(10,5,30,-15,6);
var max = Math.max.apply(null,arr);
console.log(max);
3.3 bind()
格式:
//obj : 函数内部的this指向
//arg:从第二个参数开始,依次为函数传递参数。
函数名.apply(obj,...arg);
特点
不会立即执行函数,会返回一个新的函数,该函数内部的this指向为传入的对象。
function fn(x,y){
console.log(x+y);
console.log(this);
}
var obj ={
}
fn(10,20)
var res = fn.bind(obj,10,20);
res();