วัตถุนี้เป็นข้อผิดพลาดใน JS มาโดยตลอดและเป็นเรื่องยากที่จะตัดสินสิ่งที่มันชี้ไป เรามักจะทำผิดพลาดประเภทนี้เนื่องจากประสบการณ์ของเราจาก C ++ หรือ Python ถัดไปพูดคุยเกี่ยวกับความเป็นเจ้าของของวัตถุนี้โดยละเอียด
Rule1: สิ่งนี้ในสภาพแวดล้อมโลก
สภาพแวดล้อมของจาวาสคริปต์ถูกกำหนดโดยฟังก์ชั่นโดยเนื้อแท้ ใน JS บริบทไม่สามารถคั่นด้วยบล็อกรหัส สภาพแวดล้อมที่ไม่ได้ถูกห่อหุ้มด้วยฟังก์ชั่นคือสภาพแวดล้อมระดับโลก สิ่งนี้ในสภาพแวดล้อมทั่วโลกชี้ไปที่หน้าต่างตัวแปรทั่วโลก ดูตัวอย่างต่อไปนี้
การคัดลอกรหัสมีดังนี้:
ชื่อ var = 'jjj';
console.log (this.name);
// JJJ จะส่งออกได้สำเร็จ
Rule2: สิ่งนี้เมื่อเรียกว่าเป็นวิธีการ
เห็นได้ชัดว่าสถานการณ์นี้ง่ายต่อการตัดสินมันสอดคล้องกับตัวเองใน Python สิ่งนี้ชี้ไปที่วัตถุที่เรียกวิธีการอย่างไม่ต้องสงสัย
การคัดลอกรหัสมีดังนี้:
var user = {
ชื่อ: 'kkk'
-
user.getName = function () {
console.log (this.name);
-
user.getName ();
// เอาต์พุต KKK จะถูกส่งออก
Rule3: สิ่งนี้เมื่อเป็นตัวสร้าง
ฉันไม่จำเป็นต้องพูดมากเกี่ยวกับเรื่องนี้ในเวลานี้ เห็นได้ชัดว่ามันชี้ไปที่วัตถุที่สร้างขึ้นใหม่ การทำงานของตัวสร้างไม่ได้สร้างวัตถุจริง ๆ แต่เป็นเพียงการเริ่มต้น วัตถุถูกสร้างขึ้นก่อนที่จะทำงาน
นี่คือตัวอย่างบางส่วน
การคัดลอกรหัสมีดังนี้:
ฟังก์ชันผู้ใช้ (ชื่อ) {
this.name = ชื่อ;
-
var f1 = ผู้ใช้ใหม่ ('kkk');
var f2 = ผู้ใช้ ('kkk');
console.log (f1.name); // kkk
console.log (f2.name); // undefined ไม่มีแอตทริบิวต์ชื่อ
Rule4: การโทรทางอ้อมนี้
การโทรทางอ้อมที่เรียกว่าหมายถึงการใช้ฟังก์ชั่นการเรียกใช้และการโทรไปยังฟังก์ชั่นการโทรและสิ่งนี้ชี้ไปที่พารามิเตอร์แรกในรายการพารามิเตอร์ของพวกเขา
การคัดลอกรหัสมีดังนี้:
var setName = function (ชื่อ) {
this.name = ชื่อ;
-
var user = {ระดับ: 2};
user.apply (setname, 'jjj');
console.log (user.name); // jjj
กฎข้อ 5: ในกรณีอื่น ๆ
โปรดจำไว้ว่าสิ่งนี้จะไม่เปลี่ยนแปลงในสถานการณ์อื่น ๆ และนี่ก็เป็นสถานที่ที่ง่ายที่สุดในการทำผิดพลาด
การคัดลอกรหัสมีดังนี้:
var name = "coder ที่ฉลาด";
var person = {
ชื่อ: "Foocoder",
สวัสดี: ฟังก์ชั่น (sth) {
var sayshello = function (sth) {
console.log (this.name + "พูดว่า" + sth);
-
Sayhello (sth);
-
-
person.hello ("Hello World"); // coder Clever กล่าวว่า Hello World
รหัสข้างต้นดูแปลก ๆ ไม่ควรเป็นจุดนี้หรือไม่?
เราควรจำไว้ว่าสิ่งนี้ในฟังก์ชั่นซ้อนจะไม่ชี้ไปที่ฟังก์ชั่นที่ทำรัง ในตัวอย่างนี้สิ่งนี้ใน Sayshello จะไม่ชี้ไปที่ฟังก์ชั่นที่สอดคล้องกับ Hello ถ้าเราเปลี่ยนตัวอย่างเล็กน้อย
การคัดลอกรหัสมีดังนี้:
สวัสดี: ฟังก์ชั่น (sth) {
console.log (this.name + "พูดว่า" + sth);
-
// Foocoder กล่าวสวัสดีชาวโลก
ทุกคนควรเข้าใจว่าในเวลานี้ Sayhello ไม่ได้เรียกว่าเป็นวิธีการดังนั้นสิ่งนี้ชี้ไปที่วัตถุระดับโลก - -
ในเวลานี้ปัญหาคือตัวอย่างเริ่มต้นของการใช้โหนดเพื่อเรียกใช้จะแสดง Hello World ที่ไม่ได้กำหนด ฉันสงสัยว่ามีอาจารย์ที่จะอธิบายหรือไม่
กฎข้อ 6: การประเมินแบ่งกฎทั้งหมด
จบลงด้วยตัวอย่าง
การคัดลอกรหัสมีดังนี้:
var name = "coder ที่ฉลาด";
var user = {
ชื่อ: 'kkk'
-
user.getName = function () {
console.log (this.name);
-
var get = user.getName;
get (); // coder ที่ฉลาด
คุณเข้าใจไหม