函數(shù)的幾種調(diào)用方式
01 普通函數(shù)調(diào)用 內(nèi)部的this指向全局對象window
02 構(gòu)造函數(shù)調(diào)用 內(nèi)部的this指向新創(chuàng)建的對象
03 對象的方法調(diào)用 內(nèi)部的this指向調(diào)用的對象本身
04 通過call 或者是apply方式調(diào)用(函數(shù)上下文),this指向的是當(dāng)前的上下文對象
this丟失demo演示
<script>
var obj = {
name:"張三",
getName:function () {
console.log(this.name);
}
};
//以對象的方法來進(jìn)行調(diào)用
obj.getName(); //張三
var getName = obj.getName;
getName(); //以普通函數(shù)的方式調(diào)用,此時內(nèi)部的this指向的是window對象 打印的是window.name 為空值
</script>
代碼示例02
<script>
//01 獲取頁面中id值為demo的標(biāo)簽
//var div = document.getElementById('demo');
// var getId = document.getElementById;
// var div = getId('demo'); //會報錯?
// console.log(div);
//借用apply來修正this
document.getElementById = (function (func) {
return function () {
return func.apply(document,arguments);
}
})(document.getElementById);
var getId = document.getElementById;
var div = getId('demo'); //會報錯?
console.log(div);
</script>
代碼說明:
01 因?yàn)閐ocument.getElementById方法的內(nèi)部實(shí)現(xiàn)中需要使用到this,這個this本來期望指向的是document對象
02 當(dāng)我們以document.getElementById來調(diào)用的時候,內(nèi)部的this指向document對象
03 但是當(dāng)我們以getId的方式調(diào)用的時候,內(nèi)部的this指向的是window對象(因?yàn)槲覀円云胀ǖ姆绞竭M(jìn)行調(diào)用)
- this: this所在的函數(shù)在哪個對象中, this就指向該對象(大部分情況);
- 少數(shù)情況特殊:
- 如果this在定時器中, this就指向window;
- 如果this在事件源中, this就指向產(chǎn)生這個事件源的對象。