การปิด JS
สิ่งที่ควรรู้ก่อนปิด
1. ขอบเขตฟังก์ชัน
(1). คุณสมบัติพิเศษของภาษา JS คือตัวแปรทั่วโลกสามารถอ่านได้โดยตรงภายในฟังก์ชั่น
การคัดลอกรหัสมีดังนี้:
<script type = "text/javascript">
var n = 100;
ฟังก์ชัน parent () {
การแจ้งเตือน (n);
-
ผู้ปกครอง (); // 100
</script>
ถ้าอยู่ใน php
การคัดลอกรหัสมีดังนี้:
<? php
$ n = 100;
ฟังก์ชัน parent () {
Echo $ n;
-
parent (); // ข้อผิดพลาดจะถูกรายงาน n ไม่ได้กำหนดไว้
-
(2). ตัวแปรท้องถิ่นภายในฟังก์ชั่นไม่สามารถอ่านได้นอกฟังก์ชั่น
การคัดลอกรหัสมีดังนี้:
<script type = "text/javascript">
ฟังก์ชัน parent () {
var m = 50;
-
พ่อแม่();
การแจ้งเตือน (m); // ข้อผิดพลาด m ไม่ได้กำหนดไว้
</script>
โปรดทราบว่าเมื่อประกาศตัวแปรภายในคุณต้องเพิ่ม VAR มิฉะนั้นจะมีการประกาศตัวแปรส่วนกลาง
การคัดลอกรหัสมีดังนี้:
ฟังก์ชัน parent () {
M = 50;
-
พ่อแม่();
Alert (M); // 50
// แน่นอนว่านี่ยิ่งกว่านั้นใน PHP
การคัดลอกรหัสมีดังนี้:
<? php
ฟังก์ชัน parent () {
ควรแยกออกจากกันทั่วโลก $ m; // global
$ m = 50;
-
พ่อแม่();
echo $ m; // 50
-
// หากไม่มีทั่วโลกจะไม่มีข้อผิดพลาดคำจำกัดความ
บางครั้งหากคุณต้องการรับตัวแปรท้องถิ่นภายในฟังก์ชั่นคุณต้องใช้คุณสมบัติของขอบเขตของตัวแปร JS ตัวอย่างเช่นการกำหนดฟังก์ชั่นเด็กภายในฟังก์ชั่นสำหรับฟังก์ชั่นเด็กฟังก์ชั่นหลักคือทั่วโลกและฟังก์ชั่นเด็กสามารถเข้าถึงตัวแปรในฟังก์ชั่นหลัก (สำหรับรหัส JS ทั้งหมดเป็นตัวแปรท้องถิ่น)
การคัดลอกรหัสมีดังนี้:
<script type = "text/javascript">
ฟังก์ชัน parent () {
var m = 50;
ฟังก์ชั่นลูกชาย () {
การแจ้งเตือน (M);
-
กลับมาลูกชาย;
-
var s = parent (); // บันทึกผลลัพธ์ทั่วโลก
s (); // 50
</script>
ตัวแปรท้องถิ่นทั้งหมดภายในผู้ปกครองสามารถมองเห็นฟังก์ชั่นลูกของพวกเขาได้ แต่ตัวแปรท้องถิ่นภายในฟังก์ชั่นลูกของพวกเขาจะมองไม่เห็นฟังก์ชั่นหลักของพวกเขา นี่คือโครงสร้างขอบเขตโซ่ที่ไม่ซ้ำกับ JS วัตถุลูกจะค้นหาตัวแปรวัตถุแม่ทั้งหมดตามระดับ ตัวแปรทั้งหมดของวัตถุหลักสามารถมองเห็นได้จากวัตถุลูกมิฉะนั้นมันจะไม่ถือเป็นจริง! ฟังก์ชั่นลูกชายข้างต้นคือการปิด
นักเรียนบางคนอาจทำสิ่งนี้
การคัดลอกรหัสมีดังนี้:
ฟังก์ชัน parent () {
var m = 50;
ฟังก์ชั่นลูกชาย () {
การแจ้งเตือน (M);
-
-
พ่อแม่();
son () // ฟังก์ชั่นลูกชายไม่ได้กำหนดไว้
โปรดทราบว่าใน JavaScript ฟังก์ชั่นที่ประกาศในฟังก์ชั่นนั้นเป็นแบบท้องถิ่นและจะถูกปล่อยออกมาหลังจากการทำงานของฟังก์ชั่น
ให้ความสนใจกับความแตกต่างระหว่างสิ่งนี้กับ PHP
การคัดลอกรหัสมีดังนี้:
<? php
ฟังก์ชัน parent () {
ฟังก์ชั่นลูกชาย () {
$ m = 50;
สะท้อน $ M;
-
-
พ่อแม่();
son (); // output 50 จะไม่รายงานข้อผิดพลาด
-
การปิด
ฟังก์ชั่นกำหนดฟังก์ชั่นภายในสะพานเชื่อมต่อฟังก์ชั่นภายในและภายนอก
มี 2 ฟังก์ชั่นปิด:
ก่อนอื่นฟังก์ชั่นการอ่านภายในตัวแปรดังกล่าว
ประการที่สองคือการบันทึกค่าของตัวแปรเหล่านี้ในหน่วยความจำเพื่อรับรู้การแบ่งปันข้อมูล
นี่คือตัวอย่างของการปิด
การคัดลอกรหัสมีดังนี้:
<script type = "text/javascript">
var cnt = (function () {
var i = 0;
return function () {
การแจ้งเตือน (i);
i ++;
-
-
cnt (); // 0
cnt (); // 1
cnt (); // 2
cnt (); // 3
</script>
ฉันบันทึกผลการดำเนินการของฟังก์ชั่นที่ไม่ระบุชื่อ (นั่นคือการกำหนดประกาศของฟังก์ชั่นย่อยให้กับการตัดตัวแปรทั่วโลก) ในหน่วยความจำ
เมื่อดำเนินการ cut () ค่าจะถูกดึงโดยตรงจากหน่วยความจำ สามารถเรียกใช้ฟังก์ชัน CNT () เท่านั้นและไม่สามารถแจ้งเตือนได้โดยตรง (i)
คุณยังสามารถถ่ายโอนพารามิเตอร์ไปยังการปิด
การคัดลอกรหัสมีดังนี้:
var cnt = (ฟังก์ชัน (num) {
return function () {
การแจ้งเตือน (NUM);
num ++;
-
}) (5);
cnt (); // 5
cnt (); // 6
cnt (); // 7
// แน่นอนคุณสามารถผ่านพารามิเตอร์เมื่อโทร
var cnt = (function () {
var i = 0;
ฟังก์ชั่น return (num) {
num+= i;
การแจ้งเตือน (NUM);
i ++;
-
-
cnt (1); // 1
cnt (2); // 3
cnt (3); // 5
เพื่อให้มีความเข้าใจที่ดีขึ้นเกี่ยวกับการปิดเราดูรหัสต่อไปนี้
ตัวอย่างเช่นฉันต้องการส่งคืนอาร์เรย์ด้วย 5 ฟังก์ชั่นในอาร์เรย์ฟังก์ชั่นแรกปรากฏขึ้น 0 และฟังก์ชั่นที่สองปรากฏขึ้น 1 ...
หากรหัสถูกเขียนเช่นนี้
การคัดลอกรหัสมีดังนี้:
กล่องฟังก์ชัน () {
var arr = [];
สำหรับ (i = 0; i <5; i ++) {
arr = function () {return i;}
-
กลับ arr;
-
var a = box ();
การแจ้งเตือน (a); // อาร์เรย์ที่มีห้าฟังก์ชั่นร่างกาย
การแจ้งเตือน (a [0] ());
การแจ้งเตือน (a [1] ());
ร่างกายฟังก์ชั่นป๊อปอัพ
function () {return i;}}
ในที่สุดฉันก็คือ 4 และจากนั้น ++ จะกลายเป็น 5
สำหรับการหยุดวน
พบว่าทั้งหมดโผล่ขึ้น 5 ซึ่งเห็นได้ชัดว่าไม่เป็นไปตามข้อกำหนดของเรา
วิธีแก้ปัญหา 1
การตรวจสอบด้วยตนเองภายใน
การคัดลอกรหัสมีดังนี้:
กล่องฟังก์ชัน () {
var arr = [];
สำหรับ (i = 0; i <5; i ++) {
arr = (ฟังก์ชัน (num) {return i;}) (i);
-
กลับ arr;
-
var a = box ();
สำหรับ (var i = 0; i <a.length; i ++) {
การแจ้งเตือน (a);
-
แต่เราพบว่าองค์ประกอบในอาร์เรย์ที่ส่งคืนเป็นผลมาจากการดำเนินการฟังก์ชั่น แต่สิ่งที่เราต้องการคือฟังก์ชั่นจะต้องได้รับการอัพเกรด
วิธีแก้ปัญหา 2
การปิดการใช้งาน
การคัดลอกรหัสมีดังนี้:
กล่องฟังก์ชัน () {
var arr = [];
สำหรับ (var i = 0; i <5; i ++) {
arr = (ฟังก์ชัน (num) {
return function () {return num;}
})(ฉัน);
-
กลับ arr;
-
var arr = box ();
สำหรับ (var i = 0; i <5; i ++) {
Alert (arr ()); // 0,1,2,3,4
-
รหัสคีย์
การคัดลอกรหัสมีดังนี้:
arr = (ฟังก์ชัน (num) {
return function () {return num;}
})(ฉัน);
เมื่อฉัน = 0
arr [0] = (ฟังก์ชัน (num) {return function () {return num;}}) (0);
1 นาฬิกา
arr [1] = (ฟังก์ชัน (num) {return function () {return num;}}) (1);
ข้างต้นเป็นประโยชน์ของการปิด! ง่ายมากและใช้งานได้จริง