ภายใต้ขอบเขตทั่วโลก
นี้;
เมื่อใช้สิ่งนี้ในขอบเขตทั่วโลกมันชี้ไปที่วัตถุระดับโลก
นี่คือการแนะนำรายละเอียดเกี่ยวกับวัตถุระดับโลก:
Global Object เป็นวัตถุที่ถูกสร้างขึ้นก่อนที่จะป้อนบริบทการดำเนินการใด ๆ
มีเพียงหนึ่งสำเนาของวัตถุนี้และคุณสมบัติของมันสามารถเข้าถึงได้ทุกที่ในโปรแกรม วงจรชีวิตของวัตถุระดับโลกสิ้นสุดลงในขณะที่โปรแกรมออก
ในขั้นตอนการสร้างเริ่มต้นของวัตถุทั่วโลกคณิตศาสตร์สตริงวันที่ parseint จะเริ่มต้นเป็นคุณลักษณะของตัวเอง ฯลฯ และวัตถุเพิ่มเติมอื่น ๆ สามารถสร้างเป็นแอตทริบิวต์ (ซึ่งสามารถชี้ไปที่วัตถุทั่วโลกเอง) ตัวอย่างเช่นใน DOM คุณสมบัติหน้าต่างของวัตถุทั่วโลกสามารถอ้างถึงวัตถุทั่วโลกเอง
ดังนั้นมันจึงเหมือนกับสิ่งนี้ window ในคอนโซล
เมื่อเรียกใช้ฟังก์ชัน
foo ();
ที่นี่สิ่งนี้ยังชี้ไปที่วัตถุระดับโลก
เมื่อเรียกวิธีการ
test.foo ();
ในตัวอย่างนี้สิ่งนี้จะชี้ไปที่วัตถุทดสอบ
เมื่อเรียกตัวสร้าง
ใหม่ foo ();
ฟังก์ชั่นใช้กับคำหลักใหม่เมื่อเรียกซึ่งเราเรียกว่าตัวสร้าง ในเวลานี้ภายในฟังก์ชั่นนี้ชี้ไปที่วัตถุที่สร้างขึ้นใหม่
เมื่อตั้งค่าอย่างชัดเจน
ฟังก์ชั่น foo (a, b, c) {} // var bar = {}; foo.apply (bar, [1, 2, 3]); // อาร์เรย์จะขยายไปยังด้านล่างที่เรียกว่า (บาร์, 1, 2, 3); // ผลลัพธ์ใน a = 1, b = 2, c = 3เมื่อใช้วิธีการใช้และการโทรของฟังก์ชัน prototype ค่าของสิ่งนี้จะถูกตั้งค่าอย่างชัดเจนเป็นพารามิเตอร์แรกของวิธี
ดังนั้นแตกต่างจากกฎเมื่อเรียกใช้ฟังก์ชันสิ่งนี้ในตัวอย่างด้านบนชี้ไปที่บาร์
นี่คือวิธีการโทรและการสมัคร:
วิธีการโทร :
ไวยากรณ์: การโทร ([thisobj [, arg1 [, arg2 [, [, .argn]]]]]])
คำจำกัดความ: เรียกวิธีการของวัตถุเพื่อแทนที่วัตถุปัจจุบันด้วยวัตถุอื่น
ใช้วิธีการ :
ไวยากรณ์: ใช้ ([thisobj [, argarray]])
คำจำกัดความ: ใช้วิธีหนึ่งของวัตถุบางอย่างและแทนที่วัตถุปัจจุบันด้วยวัตถุอื่น
ที่นี่เราต้องทราบว่าสิ่งนี้ไม่สามารถใช้เพื่อชี้ไปที่วัตถุเองเมื่อมีการประกาศวัตถุอย่างแท้จริง ดังนี้:
var obj = {me: this}ที่นี่สิ่งนี้จะไม่ชี้ไปที่ OBJ และการประยุกต์ใช้สิ่งนี้ถูก จำกัด ไว้ที่ห้าสถานการณ์ข้างต้น
สรุป
แม้ว่าสถานการณ์ข้างต้นส่วนใหญ่จะมีความหมาย แต่ในกรณีที่สอง (เช่นเมื่อเรียกฟังก์ชั่น) จริง ๆ แล้วไม่ค่อยมีประโยชน์ซึ่งถือเป็นข้อผิดพลาดอีกข้อหนึ่งในการออกแบบ JavaScript
foo.method = function () {function test () {// สิ่งนี้ถูกตั้งค่าเป็น global object} test ();}ดังที่เราได้กล่าวไว้ข้างต้นสิ่งนี้จะชี้ไปที่วัตถุระดับโลกไม่ใช่ฟังก์ชั่น FOO
เพื่อให้ได้วิธีที่จะชี้ไปที่ Foo ในการทดสอบเราจำเป็นต้องสร้างตัวแปรท้องถิ่นภายในวิธีการชี้ไปที่ Foo
foo.method = function () {var that = this; ฟังก์ชั่นทดสอบ () {// ใช้สิ่งนั้นแทนสิ่งนี้ที่นี่} test ();}นั่นเป็นเพียงชื่อตัวแปรปกติ แต่มักใช้เพื่อชี้ไปที่ภายนอกนี้
มีอีกสิ่งที่น่าสนใจที่เกี่ยวข้องกับนามแฝงฟังก์ชั่นนั่นคือเมื่อวิธีการถูกกำหนดให้กับตัวแปร
var test = someObject.methodtest; test ();
ในตัวอย่างข้างต้นการทดสอบจะได้รับการปฏิบัติเป็นฟังก์ชันปกติดังนั้นตามกรณีที่สอง (เช่นเมื่อมีการเรียกฟังก์ชั่น) สิ่งนี้จะชี้ไปที่ตัวแปรทั่วโลก
แม้ว่าการผูกมัดล่าช้านี้ดูเหมือนจะเป็นการตัดสินใจที่ไม่ดีในตอนแรก แต่จริงๆแล้วมันเป็นพื้นฐานของการสืบทอดต้นแบบ
function foo () {} foo.prototype.method = function () {}; function bar () {} bar.prototype = foo.prototype; แถบใหม่ (). method ();ณ จุดนี้เมื่อมีการเรียกวิธีการมันจะชี้ไปที่วัตถุอินสแตนซ์ของบาร์