ฉันจะเปลี่ยนค่าของตัวแปรส่วนกลางภายในฟังก์ชันได้อย่างไร


131

ฉันใช้ JavaScript และฉันสร้างตัวแปรส่วนกลาง ฉันกำหนดไว้นอกฟังก์ชันและฉันต้องการเปลี่ยนค่าตัวแปรส่วนกลางจากภายในฟังก์ชันและใช้จากฟังก์ชันอื่นฉันจะทำสิ่งนี้ได้อย่างไร

คำตอบ:


148

เพียงแค่อ้างอิงตัวแปรภายในฟังก์ชัน ไม่มีเวทมนตร์เพียงแค่ใช้ชื่อ หากมีการสร้างขึ้นทั่วโลกแสดงว่าคุณกำลังอัปเดตตัวแปรส่วนกลาง

คุณสามารถลบล้างพฤติกรรมนี้ได้โดยการประกาศโดยใช้ภายในvarเครื่อง แต่ถ้าคุณไม่ได้ใช้varชื่อตัวแปรที่ใช้ในฟังก์ชันจะเป็นแบบโกลบอลหากมีการประกาศตัวแปรนั้นทั่วโลก

นั่นจึงถือเป็นแนวทางปฏิบัติที่ดีที่สุดในการประกาศตัวแปรของคุณอย่างชัดเจนvarเสมอ เพราะถ้าคุณลืมคุณจะเริ่มยุ่งกับลูกโลกได้โดยบังเอิญ มันเป็นเรื่องง่ายที่จะทำ แต่ในกรณีของคุณสิ่งนี้กลับกลายเป็นคำตอบที่ง่ายสำหรับคำถามของคุณ


3
สิ่งนี้ใช้ไม่ได้สำหรับฉัน: country = 'foo' $ .ajax ({url: '/ some-endpoint', success: function (data) {country = data.country;}}); console.log (ประเทศ) // ผลลัพธ์ 'foo'
Mark Simpson

41
@MarkSimpson - สาเหตุที่ใช้ไม่ได้เนื่องจากในตัวอย่างของคุณการconsole.logเรียกใช้งานทันที แต่ฟังก์ชันความสำเร็จของ ajax จะทำงานในบางจุดในภายหลังเมื่อการโทร ajax ส่งคืนการตอบสนองจริง นี่เป็นจุดพื้นฐานเกี่ยวกับลักษณะอะซิงโครนัสของ ajax: code ในฟังก์ชันการปิดไม่ทำงานตามลำดับพร้อมกับโค้ดที่อยู่รอบ ๆ นี่เป็นสิ่งสำคัญที่ต้องเข้าใจเมื่อเรียนรู้เกี่ยวกับโค้ดที่ขับเคลื่อนด้วยเหตุการณ์
Spudley

วิธีที่จะทำให้ console.log มีความแม่นยำมากขึ้นในกรณีนี้คือการวางไว้ในฟังก์ชัน ajax success
DWils

ข้อมูลเชิงลึกที่ยอดเยี่ยมอีกอย่างของฉัน: ตรวจสอบการสะกดและตัวพิมพ์ของชื่อตัวแปรอีกครั้ง มันง่ายมากที่จะพลาดอะไรง่ายๆอย่างเช่น sessionId เทียบกับ sessionID
หนวดขาว

ฉันมีปัญหาเดียวกันกับสิ่งเหล่านี้ แต่ในที่สุดก็เข้าใจขอบคุณ @Spudley!
Yudhistira Bayu

63
var a = 10;

myFunction();

function myFunction(){
   a = 20;
}

alert("Value of 'a' outside the function " + a); //outputs 20

1
ขอบคุณสำหรับตัวอย่างง่ายๆที่ยอดเยี่ยมนี้ ตรรกะของเรื่องนี้กำลังทำให้ผมเข้ามาเพิ่งคุ้นเคยกับการคิดแบบ 4d
Mikey3Strings

29

เพียงแค่ใช้ชื่อของตัวแปรนั้น

ใน JavaScript ตัวแปรจะอยู่เฉพาะในฟังก์ชันเท่านั้นหากเป็นพารามิเตอร์ของฟังก์ชันหรือหากคุณประกาศให้เป็นแบบโลคัลอย่างชัดเจนโดยการพิมพ์varคำสำคัญก่อนชื่อของตัวแปร

ถ้าชื่อของค่าโลคัลมีชื่อเดียวกับค่าส่วนกลางให้ใช้windowอ็อบเจกต์

ดูjsfiddleนี้

x = 1;
y = 2;
z = 3;

function a(y) {
  // y is local to the function, because it is a function parameter
  console.log('local y: should be 10:', y); // local y through function parameter
  y = 3; // will only overwrite local y, not 'global' y
  console.log('local y: should be 3:', y); // local y
  // global value could be accessed by referencing through window object
  console.log('global y: should be 2:', window.y) // global y, different from local y ()

  var x; // makes x a local variable
  x = 4; // only overwrites local x
  console.log('local x: should be 4:', x); // local x
  
  z = 5; // overwrites global z, because there is no local z
  console.log('local z: should be 5:', z); // local z, same as global
  console.log('global z: should be 5 5:', window.z, z) // global z, same as z, because z is not local
}
a(10);
console.log('global x: should be 1:', x); // global x
console.log('global y: should be 2:', y); // global y
console.log('global z: should be 5:', z); // global z, overwritten in function a

แก้ไข

ด้วย ES2015 มีคำหลักอีกสองคำconstและletมีผลต่อขอบเขตของตัวแปรด้วย ( ข้อกำหนดภาษา )


1
+1 สำหรับอธิบายการชนกันของชื่อระหว่างตัวแปรส่วนกลางและตัวแปรที่ประกาศในเครื่องและวิธีการเข้าถึง
gdbj

6
<script>
var x = 2; //X is global and value is 2.

function myFunction()
{
 x = 7; //x is local variable and value is 7.

}

myFunction();

alert(x); //x is gobal variable and the value is 7
</script>

แค่ไม่ใช้varคีย์เวิร์ดในฟังก์ชั่นก็ไม่ต้องจัดการdocument.getElementById("outside").value = x;
Ben Aubin

5
var a = 10;

myFunction(a);

function myFunction(a){
   window['a'] = 20; // or window.a
}

alert("Value of 'a' outside the function " + a); //outputs 20

ด้วย window ['variableName']หรือwindow.variableNameคุณสามารถแก้ไขค่าของตัวแปรส่วนกลางภายในฟังก์ชัน


นี่เป็นวิธีเดียวที่ฉันสามารถเปลี่ยนค่าตัวแปรส่วนกลางในองค์ประกอบเชิงมุม !!!
Padmaraj Bhat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.