ใน javascript มีคีย์เวิร์ด “this” เป็นคำพิเศษที่ถูกใช้ในฟังก์ชัน เพื่ออ้างไปถึง object ที่ใช้ในฟังก์ชันที่ถูกเรียกใช้อยู่ โดยค่าของ this จะเป็นอะไรนั้นก็มีวิธีการพิจารณาเป็นขั้นเป็นตอนอยู่ประมาณนี้
[imooh_google_ads]
1. ถ้าฟังก์ชันถูกเรียกใช้งานผ่าน .call() หรือ .apply() ค่าของ this ที่ใช้ในฟังก์ชันที่ถูกเรียกจะอ้างไปยัง object ที่เป็น argument แรกที่ส่งเข้ามาในฟังก์ชัน .call()/.apply() ในกรณีที่ไม่มีการส่ง argument เข้ามาหรือค่าที่ส่งเข้ามามีค่าเป็น null หรือ undefine ค่าของ this จะอ้างไปยัง global object
// เรียกใช้ฟังก์ชันด้วย .call()
var myObject = {
sayHello: function() {
console.log( "Hi! My name is " + this.myName );
},
myName: "Rebecca"
};
var secondObject = {
myName: "Colin"
};
myObject.sayHello(); // "Hi! My name is Rebecca"
myObject.sayHello.call( secondObject ); // "Hi! My name is Colin"
2. ถ้าฟังก์ชันที่กำลังถูกเรียกสร้างมาจากฟังก์ชัน .bind() this ก็จะเป็น argument แรกที่ส่งให้ฟังก์ชัน .bind() ครับ
// A function created using Function.bind()
var myName = "the global object";
var sayHello = function() {
console.log( "Hi! My name is " + this.myName );
};
var myObject = {
myName: "Rebecca"
};
var myObjectHello = sayHello.bind( myObject );
sayHello(); // "Hi! My name is the global object"
myObjectHello(); // "Hi! My name is Rebecca"
3. ในกรณีที่ฟังก์ชันอยู่ภายใต้ object และถุกเรียกใช้งานผ่าน object this จะหมายถึง object นั้นๆ ครับ
// A function being attached to an object at runtime.
var myName = "the global object";
var sayHello = function() {
console.log( "Hi! My name is " + this.myName );
};
var myObject = {
myName: "Rebecca"
};
var secondObject = {
myName: "Colin"
};
myObject.sayHello = sayHello;
secondObject.sayHello = sayHello;
sayHello(); // "Hi! My name is the global object"
myObject.sayHello(); // "Hi! My name is Rebecca"
secondObject.sayHello(); // "Hi! My name is Colin"
4. นอกเหนือจากที่กล่าวมา ถ้าฟังก์ชันไม่ได้อยุ่ภายใต้ object อะไรเลยแล้วถูกเรียกใช้เลย this จะอ้างถึง global object ครับผม ^^
ในกรณีที่เรามีการสร้างฟังก์ชันไว้ภายใต้ namespace ที่ยาวๆ ไม่ควรจะสร้างตัวแปรขึ้นมาอ้างไปยังฟังก์ชันที่อยู่ใน namespace นั้นๆ เพราะจะทำให้ค่าของ this ไม่ถูกต้องได้ เช่น
var myNamespace = {
myObject: {
sayHello: function() {
console.log( "Hi! My name is " + this.myName );
},
myName: "Rebecca"
}
};
var hello = myNamespace.myObject.sayHello;
hello(); // "Hi! My name is undefined"
ถ้าต้องการจะย่อลงมาจริงๆ ก็ควรจะเอาให้ถึงแค่ object ที่เป็นเจ้าของฟังก์ชันที่เราต้องการจะเรียกก็พอครับ
var myNamespace = {
myObject: {
sayHello: function() {
console.log( "Hi! My name is " + this.myName );
},
myName: "Rebecca"
}
};
var obj = myNamespace.myObject;
obj.sayHello(); // "Hi! My name is Rebecca"
สามารถอ่านข้อมูลเพิ่มเติมได้ที่นี่เลยครับ: The “this” Keyword | jQuery Learning Center