1. 程式人生 > >this的指向問題

this的指向問題

col itl 一個 expand bsp 例子 {} 調用 body

聲明:本文來源“追夢子”大大的文章《徹底理解js中this的指向,不必硬背。

偶遇此文自我總結一下,受益良多

一、對象中的this

例1:
  function a(){
    var user = "追夢子";
    console.log(this.user); //undefined
    console.log(this); //Window
}
a();
// 註意函數是在什麽作用域中調用的
//這個函數實在全局作用域中調用所以this指向的是window 全局中沒有user所以是undefineds
例2:
var o = {
    user:
"追夢子", fn:function(){ console.log(this.user); //追夢子 } } o.fn(); //這個函數是通過o.fn()點出來的,所以的指向的是o 強調一點:函數在創建的時候無法確定this的指向,誰調用這個函數this就指向誰 例3: var o = { a:10, b:{ a:12, fn:function(){ console.log(this.a); //12 } } } o.b.fn()

總結上面三個例子

1.如果一個函數中有this,如果它沒有被上一級對象所調用,那麽這個this指向window

2.如果一個函數中有this,且被它的上一級對象調用,此時這個this指向它的上一級對象

3.如果一個函數中有this 這個函數中包含多個對象,盡管這個函數是被最外層的對象所調用,this指向也只是它的上一級對象

註意:

var o = {
    a:10,
    b:{
        a:12,
        fn:function(){
            console.log(this.a); //undefined
            console.log(this
); //window } } } var j = o.b.fn; j(); // 註意這個實例 在這裏fn只是賦值給j並沒有調用,然後j在全局作用域下調用,所以這個this指向的是window

二、構造函數中的this

function Fn(){
    this.user = "追夢子";
}
var a = new Fn();
console.log(a.user); //追夢子
//這裏面的this通過this改變了this指向

三、當this遇到return時(需要特別註意)

function fn()  
{  
    this.user = 追夢子;  
    return {};  
}
var a = new fn;  
console.log(a.user); //undefined
----------------------------------------
function fn()  
{  
    this.user = 追夢子;  
    return function(){};
}
var a = new fn;  
console.log(a.user); //undefined
----------------------------------------
function fn()  
{  
    this.user = 追夢子;  
    return 1;
}
var a = new fn;  
console.log(a.user); //追夢子
-------------------------------------------
function fn()  
{  
    this.user = 追夢子;  
    return undefined;
    //undefined是特殊的變量
}
var a = new fn;  
console.log(a.user); //追夢子
------------------------------------------
總結:如果返回值是一個對象,那麽this指向的就是那個返回的對象 如果返回值不是一個對象那麽this還是指向函數的實例

註意:null也是對象但是這裏的this還是指向那個函數的實例

function fn()  
{  
    this.user = 追夢子;  
    return null;
}
var a = new fn;  
console.log(a.user); //追夢子

this的指向問題