คำนำ
การโทรและใช้ ทั้งสองมีอยู่เพื่อเปลี่ยน บริบท นั่นคือบริบทเมื่อมีการเรียกใช้ฟังก์ชั่น กล่าวอีกนัยหนึ่งคือ การเปลี่ยนทิศทางของสิ่งนี้ภายในร่างกายฟังก์ชั่น
ฟังก์ชั่นของ การโทรและการใช้งานนั้น เหมือนกัน แต่วิธีการยอมรับพารามิเตอร์นั้นแตกต่างกัน
คำจำกัดความของวิธีการ
นำมาใช้
วิธี Function.apply(obj,args) สามารถรับพารามิเตอร์สองตัว:
OBJ: วัตถุนี้จะแทนที่วัตถุนี้ในคลาสฟังก์ชัน
Args: นี่คืออาร์เรย์หรืออาร์เรย์คลาส วิธีการใช้งานผ่านองค์ประกอบในคอลเลกชันนี้เป็นพารามิเตอร์ไปยังฟังก์ชันที่เรียกว่า
เรียก
พารามิเตอร์แรกของ วิธีการโทร เหมือนกับ วิธีการใช้ ยกเว้นว่าพารามิเตอร์ที่สองเป็นรายการพารามิเตอร์
ในโหมดที่ไม่ใช่ Strict เมื่อพารามิเตอร์แรกของเราถูกส่งผ่านเป็น NULL หรือไม่ได้กำหนดไว้ในตัวฟังก์ชั่นจะชี้ไปที่วัตถุโฮสต์เริ่มต้นและในเบราว์เซอร์มันเป็นหน้าต่าง
var test = function () {console.log (this === หน้าต่าง);} test.apply (null); // truetest.call (undefined); // trueการใช้งาน
วิธี "จี้" คนอื่น ๆ
ในเวลานี้วิธี logname ใน foo จะถูกอ้างอิงโดย Bar ซึ่ง ชี้ไปที่ บาร์
var foo = {ชื่อ: "mingming", logName: function () {console.log (this.name); }} var bar = {ชื่อ: "xiaowang"}; foo.logname.call (bar); // xiaowangตระหนักถึงมรดก
ฟังก์ชันสัตว์ (ชื่อ) {this.name = name; this.showname = function () {console.log (this.name); }} ฟังก์ชั่น cat (ชื่อ) {iment.call (ชื่อนี้); } var cat = แมวใหม่ ("แมวดำ"); cat.showname (); // แมวดำในการพัฒนาจริงสิ่งนี้มักจะพบกับสถานการณ์ที่เปลี่ยนแปลงโดยไม่ได้ตั้งใจ
มีวิธี การสนุก ๆ ในท้องถิ่น เมื่อ ความสนุก ถูกเรียกว่าเป็นฟังก์ชั่นปกติจุด สนุก ๆ นี้ ไปที่ หน้าต่าง แต่เรามักต้องการให้มันชี้ไปที่ #Test Node ดูรหัสต่อไปนี้:
window.id = "window"; document.QuerySelector ('#test'). onClick = function () {console.log (this.id); // ทดสอบ var fun = fund () {console.log (this.id); } fun (); // window}การใช้ การโทรใช้ เราสามารถแก้ปัญหานี้ได้อย่างง่ายดาย
window.id = "window"; document.QuerySelector ('#test'). onClick = function () {console.log (this.id); // ทดสอบ var fun = fund () {console.log (this.id); } fun.call (this); // test}แน่นอนว่าคุณสามารถทำได้ แต่ใน ECMASCript 5 โหมด ที่เข้มงวด ในกรณีนี้ได้รับการระบุว่ามันจะไม่ชี้ไปที่วัตถุระดับโลก แต่ ไม่ได้กำหนดไว้:
window.id = "window"; document.QuerySelector ('#test'). onClick = function () {var that = this; console.log (this.id); // ทดสอบ var fun = fund () {console.log (that.id); } fun (); // test} ฟังก์ชั่น func () {"ใช้การแจ้งเตือนที่เข้มงวด" (นี้); // เอาต์พุต: undefined} func ();ประเพณีอื่น ๆ
อาร์เรย์ชั้นเรียน
ที่นี่วัตถุที่ตรงตามเงื่อนไขต่อไปนี้เรียกว่าอาร์เรย์คลาส
1. มีแอตทริบิวต์ความยาว
2. เก็บข้อมูลตามดัชนี
3. ผลักดันป๊อปและวิธีอื่น ๆ ที่ไม่มีอาร์เรย์
อาร์เรย์ทั่วไปของชั้นเรียนรวมถึง ข้อโต้แย้งและ nodelist!
(function () {array.prototype.push.call (อาร์กิวเมนต์, 4); console.log (อาร์กิวเมนต์); // [1, 2, 3, 4]}) (1,2,3)ด้วยวิธีนี้ผลักดัน 4 เข้าไปใน ข้อโต้แย้ง
หน้า Array.prototype.push สามารถใช้การรวมกันของสองอาร์เรย์
วิธีการกดไม่ได้ให้อาร์เรย์แบบพุช แต่ให้ push (param1, param, … paramn) เพื่อให้คุณสามารถติดตั้งและแทนที่อาร์เรย์โดยการสมัครนั่นคือ:
var arr1 = อาร์เรย์ใหม่ ("1", "2", "3"); var arr2 = อาร์เรย์ใหม่ ("4", "5", "6"); array.prototype.push.apply (arr1, arr2); console.log (arr1); // ["1", "2", "3", "4", "5", "6"นอกจากนี้ยังสามารถเข้าใจได้ด้วยวิธีนี้ ARR1 เรียกวิธี การพุช และพารามิเตอร์จะถูกแทนที่โดย การใช้ ชุดประกอบอาร์เรย์ลงในชุดของรายการพารามิเตอร์
ตัวอย่างเช่นฉันต้องการค้นหาค่าสูงสุดในอาร์เรย์คลาส
(function () {var maxnum = math.max.apply (null, อาร์กิวเมนต์); console.log (maxnum); // 56}) (34,2,56);ประเภทผู้พิพากษา
console.log (object.prototype.toString.call (123)) // [หมายเลขวัตถุ] console.log (Object.prototype.toString.call ('123')) // [Object String] console.log (object.prototype.tostring.call undefined] console.log (object.prototype.toString.call (true)) // [boolean วัตถุ] console.log (object.prototype.toString.call ({})) // [วัตถุ] console.log (object.prototype.tostring.call (]) array] console.log (object.prototype.toString.call (function () {})) // [ฟังก์ชันวัตถุ]ข้างต้นเป็นเนื้อหาทั้งหมดของการสรุปการใช้งานและการโทร ทุกคนยินดีที่จะฝากข้อความเพื่อเข้าร่วมในการสนทนา ฉันหวังว่าบทความนี้จะเป็นประโยชน์กับทุกคนในการเรียนรู้ JavaScript