2014-12-19 79 views
0

我無法讓我的嵌套函數識別「this」關鍵字。這是一個例子。我有一個構造函數:嵌套函數無法識別javascript「this」關鍵字

function person(first, last, age, eyecolor) { 
    this.firstName = first; 
    this.lastName = last; 
    this.age = age; 
    this.changeName = changename; 
} 

我有一個嵌套函數的另一個功能:

function changeName (name) { 
    this.lastname = name; 
    $.post("display.php", "some_data", function(data,status) { 
     if (status=="success") { 
       alert(this.lastName); //undefined 
     } 
    } 

}

+0

不,類名通常的慣例是讓他們進行資本化(即'Person',不'person')。 – 2014-12-19 08:11:12

回答

2

功能需要從你要麼使用.bind或認爲「黑客」在內的功能設置此通過使用function.protoype.bind

function changeName (name) { 

    this.lastname = name; 
    $.post("display.php", "some_data", function(data,status) { 
     if (status=="success") { 
       alert(this.lastName); //undefined 
     } 
    }.bind(this)) 
} 

這是一個相當不錯的explanation

+0

*此*不是「繼承的」,它是由函數的調用方式設置的。 – RobG 2014-12-19 08:19:14

+0

@RobG - 同意,差的詞選擇。 – 2014-12-19 08:19:50

+0

謝謝Sten Muchow。非常有意義。 – user1233147 2014-12-19 08:25:20

1

這是因爲this,在事件處理程序,是window。您可以在changeName範圍定義別名是這樣的:

function changeName (name) { 

    var that = this; 

    this.lastname = name; 
    $.post("display.php", "some_data", function(data,status) { 
     if (status=="success") { 
       alert(that.lastName); //undefined 
     } 
    } 
} 

或者:

function changeName (name) { 
    var p = this; 
    p.lastname = name; 
    $.post("display.php", "some_data", function(data,status) { 
     if (status=="success") { 
       alert(p.lastName); 
     } 
    } 
}