this
可以用在构造函数之中,表示实例对象。除此之外,this
还可以用在别的场合。但不管是什么场合,this
都有一个共同点:它总是返回一个对象。
简单说,this
就是属性或方法“当前”所在的对象。
代码示例:
function f() {
return '姓名:'+ this.name;
}
var A = {
name: '张三',
describe: f
};
var B = {
name: '李四',
describe: f
};
console.log(A.describe()) // "姓名:张三"
console.log(B.describe()) // "姓名:李四"
可以看到this就是指向当前所在的对象,第一个输出语句所在的对象是A,此时this就指向A这个对象,第二个输出语句就指向B这个对象。
接下来再看一个例子:
var user = {
name:'张三',
age: 20,
describe: function (){
setTimeout(function (){
console.log('姓名:'+this.name)
},1000)
}
}
user.describe() //此时this指向的是window
当然这里给一个解决方案:
var user = {
name:'张三',
age: 20,
describe: function (){
let $this = this;
setTimeout(function (){
console.log( '姓名:'+$this.name)
},1000)
}
}
user.describe()
可以看到我们在定时器之前设置了一个$this来获取到了指向user的this,后续我们也只调用$this.
当然不止这一种困扰我们的情况,接下来我就只给出三个绑定this指向的方法:
Function.prototype.call()
函数实例的call
方法,可以指定函数内部this
的指向(即函数执行时所在的作用域),然后在所指定的作用域中,调用该函数。
var obj = {};
var f = function () {
return this;
};
f() === window // true
f.call(obj) === obj // true
上面代码中,全局环境运行函数f
时,this
指向全局环境(浏览器为window
对象);call
方法可以改变this
的指向,指定this
指向对象obj
,然后在对象obj
的作用域中运行函数f
。
call
的第一个参数就是this
所要指向的那个对象(如果参数为空、null
和undefined
,则默认传入全局对象。),后面的参数则是函数调用时所需的参数。
func.call(thisValue, arg1, arg2, ...)
Function.prototype.apply()
apply
方法的作用与call
方法类似,也是改变this
指向,然后再调用该函数。唯一的区别就是,它接收一个数组作为函数执行时的参数,使用格式如下。
func.apply(thisValue, [arg1, arg2, ...])
Function.prototype.bind()
bind()
方法用于将函数体内的this
绑定到某个对象,然后返回一个新函数,它与上面两个的区别就是不调用函数而是返回一个函数。
var fun1 = fun2.bind(obj);
此时fun1与fun2的区别就是fun1指向obj对象。