在JavaScript中守问,主要研究的是函數(shù)中的this署恍。
如果在全局作用域下的this项鬼,如下:
console.log(this); // -> window
此時(shí)this指向window。
JavaScript中的this耻陕,代表的是當(dāng)前行為執(zhí)行的主體; JavaScript中的context代表的是當(dāng)前行為執(zhí)行的環(huán)境(區(qū)域)拙徽。
什么是執(zhí)行主體?以下代碼可以說(shuō)明:
function eat() {
this -> zhangsan
}
zhangsan.eat();
~function () {
zhangsan.eat();
}();
zhangsan在餐廳吃飯, 這里的this指的zhangsan, 餐廳是他的上下文诗宣。
但是zhangsan不管在哪里吃飯膘怕,吃飯的都是他自己。
同樣的召庞,在JavaScript中岛心,this的指代與上下文無(wú)關(guān)。
this 是誰(shuí)篮灼,和函數(shù)在哪里定義的和執(zhí)行的都沒有任何的關(guān)系; 那如何區(qū)分this呢忘古?
- 函數(shù)執(zhí)行,首先看函數(shù)名之前有沒有 ".", 有的話诅诱,"."前面是誰(shuí)this就是誰(shuí)髓堪;沒有的話this就是window。
function fn() {
console.log(this);
}
var obj = {
fn: fn
};
fn(); // this -> window
obj.fn(); // this -> obj
function sum() {
// sum的this -> window
fn(); // this -> window
};
sum();
var oo = {
// sum的this -> oo
sum: function () {
fn();
}
}
oo.sum(); // this -> window
- 自執(zhí)行函數(shù)中的this永遠(yuǎn)是window。
~function() {
console.log(this); // this -> window
}();
- 給元素的某一個(gè)事件綁定方法干旁,當(dāng)事件觸發(fā)的時(shí)候驶沼,執(zhí)行對(duì)應(yīng)的方法,方法中的this是當(dāng)前的元素争群。
document.getElementById('div1').onclick = fn; // fn中的this -> 當(dāng)前那個(gè)#div1
document.getElementById('div1').onbclick = function () {
// function中的this -> #div1
fn(); // this -> window
}
- 在構(gòu)造函數(shù)模式中商乎,this代表的就是當(dāng)前的實(shí)例。
function CreateJsPerson(name, age) {
// 瀏覽器默認(rèn)創(chuàng)建的對(duì)象就是我們的實(shí)例 p1 -> this
this.name = name; // -> p1.name = name;
this.age = age; // -> p1.age = age;
this.writeJs = function () {
console.log('my name is ' + this.name + ', age is ' + this.age);
}
// 瀏覽器把創(chuàng)建的實(shí)例默認(rèn)的返回
}
var p1 = new CreateJsPerson('zhangsan', 20);
p1.writeJs(); // this -> p1, writeJS -> this -> p1