สิ่งที่ทำให้เกิดปัญหานี้เป็นผลมาจากการรันของโปรแกรม JS:
การคัดลอกรหัสมีดังนี้:
var i = 0;
ฟังก์ชัน A () {
สำหรับ (i = 0; i <20; i ++) {
-
-
ฟังก์ชั่น b () {
สำหรับ (i = 0; i <3; i ++) {
a ();
-
กลับฉัน;
-
var result = b ();
ผลลัพธ์ของการทำงานของโปรแกรมนี้คือผลลัพธ์ = 21;
จากโปรแกรมนี้เราจะเห็นได้ว่าไม่มีปัญหาว่าค่าของฉันคือ 20 เมื่อฟังก์ชั่นส่งคืน
เมื่อฟังก์ชัน B ส่งคืนมันก็คุ้มค่าที่จะพูดคุยกันว่ามูลค่าของฉันคือ 20 หรือ 21
สาระสำคัญของปัญหาคือ: ก่อนอื่นตรวจสอบว่าฉัน <3 หรือ i ++ ดำเนินการก่อนแล้วพิจารณาว่าฉัน <3
จากผลการดำเนินการจะเห็นได้ว่า I ++ ถูกดำเนินการก่อน
การคัดลอกรหัสมีดังนี้:
ฟังก์ชัน A () {
สำหรับ (i = 0; i <20; i ++) {
// ไม่มี var i
// ฉันนี่คือตัวแปรระดับโลกที่ทุกคนสามารถเข้าถึงได้
-
-
ฟังก์ชั่น b () {
สำหรับ (i = 0; i <3; i ++) {
// Alert (i); // ในทำนองเดียวกันฉันที่นี่ยังเป็นตัวแปรส่วนกลาง, ส่งคืน 0 และเพียงครั้งเดียว
A (); // ฟังก์ชั่นนี้ส่งคืน i = 20
// เมื่อฉัน = 20 ผ่าน i ++ และ i = 21 จากนั้นมันไม่เป็นไปตามเงื่อนไขของ i <3 และออกโดยตรง กลับมาแล้วฉัน = 21 นี่เป็นเรื่องปกติ!
-
กลับฉัน;
-
var result = b ();
ที่นี่เราทำตามลำดับการดำเนินการของ For Loop:
ขั้นตอนต่อไปนี้เป็นตัวอย่าง
การคัดลอกรหัสมีดังนี้:
สำหรับ (int i = 0; i <10; i ++)
-
-
ทำการแรก I = 0; i <10; จากนั้นดำเนินการรอบแรกของร่างกายวนรอบ
จากนั้นดำเนินการ: i ++, i <10; จากนั้นดำเนินการรอบที่สองของร่างกายลูป
จนกระทั่ง I ++ สุดท้ายหลังจากฉัน> = 10 ลูปจะสิ้นสุดลง
ตอนนี้
คำสั่ง 1 จะถูกดำเนินการก่อนเริ่มลูป (บล็อกรหัส) เริ่มต้นขึ้น
คำสั่ง 2 กำหนดเงื่อนไขสำหรับการเรียกใช้ลูป (บล็อกรหัส)
คำสั่ง 3 ดำเนินการหลังจากลูป (บล็อกรหัส) ถูกดำเนินการแล้ว