函數(shù)內(nèi)this指向
this的指向是在函數(shù)調(diào)用的時(shí)候決定的,調(diào)用方式不同決定了指向不同,一般都指向調(diào)用者。
- 普通函數(shù) 指向window,window為普通函數(shù)的調(diào)用者,window.fun();
- 對(duì)象方法的調(diào)用指向該對(duì)象。
- 構(gòu)造函數(shù)調(diào)用指向?qū)嵗龑?duì)象,原型對(duì)象里面的方法也指向?qū)嵗龑?duì)象
- 事件綁定函數(shù)指向綁定事件對(duì)象
- 定時(shí)器函數(shù)和立即執(zhí)行函數(shù) 都指向window
改變函數(shù)內(nèi)部this的指向
javaScript 提供了一些方法能改變this的指向,常用的有bind(),call(),apply()
- call()
call() 可以調(diào)用函數(shù),也可以改變函數(shù)this的指向
call(thisArg,age,age....)
var o = {
name : '對(duì)象'
}
function fn (){
}
fn.call(o)
call()用于繼承
function Father(name,age,sex){
this.name=name;
this.age=age;
this.sex=sex;
}
function Son(name,age,sex){
father.call(this,name,age,sex)
}
var son = new Son(‘成龍’,20,'男');
- apply()
可以調(diào)用函數(shù),可以改變this指向
fun.apply(thisArg,[argsArray]);
thisArg,函數(shù)運(yùn)行時(shí)的this值
argsArray ,傳遞參數(shù)必須在數(shù)組內(nèi)
例子如借助數(shù)學(xué)內(nèi)置對(duì)象求最大值
var arr = [12,22,55,6,88,10,189]
var max = Math.max.apply(Math,arr);
- bind() 方法
不會(huì)調(diào)用函數(shù),但是能改變this指向。返回的是原函數(shù)this指向改變之后的新函數(shù)
fun.bind(thisArg,arg1,arg2....);
var o ={
name:'中國(guó)'
}
function fn(a,b){
console.log(this)
console.log(a + b)
}
var newFn = fn.bind(o,2,5);
newFn();
應(yīng)用 如函數(shù)不想立即執(zhí)行,但是想改變this指向。
例子:按鈕點(diǎn)擊之后,禁用按鈕,3秒鐘之后開(kāi)啟
var btn = document.querySelector('button');
btn.onclick = function(){
this.disabled = true;
setTimeout(function(){
this.disabled = false;
}.bind(this),3000);
}