Làm cách nào để thay đổi giá trị của biến toàn cục bên trong hàm


130

Tôi đang sử dụng JavaScript và tôi tạo một biến toàn cục. Tôi xác định nó bên ngoài một hàm và tôi muốn thay đổi giá trị biến toàn cục từ bên trong một hàm và sử dụng nó từ một hàm khác, làm thế nào để tôi làm điều này?

Câu trả lời:


147

Chỉ cần tham khảo biến bên trong hàm; không có phép thuật, chỉ cần sử dụng tên của nó. Nếu nó được tạo trên toàn cầu, thì bạn sẽ cập nhật biến toàn cục.

Bạn có thể ghi đè hành vi này bằng cách khai báo cục bộ bằng cách sử dụng var, nhưng nếu bạn không sử dụng var, thì tên biến được sử dụng trong hàm sẽ là toàn cục nếu biến đó đã được khai báo trên toàn cầu.

Đó là lý do tại sao nó được coi là thực tiễn tốt nhất để luôn khai báo các biến của bạn một cách rõ ràng var. Bởi vì nếu bạn quên nó, bạn có thể bắt đầu gây rối với toàn cầu một cách tình cờ. Đó là một sai lầm dễ mắc phải. Nhưng trong trường hợp của bạn, điều này quay lại và trở thành một câu trả lời dễ dàng cho câu hỏi của bạn.


3
Điều này không hiệu quả với tôi: country = 'foo' $ .ajax ({url: '/ some-endpoint', thành công: function (data) {country = data.country;}}); console.log (country) // xuất ra 'foo'
Mark Simpson

41
@MarkSimpson - lý do nó không hoạt động là vì trong ví dụ của bạn, console.lognó được chạy ngay lập tức, nhưng chức năng thành công ajax chỉ chạy vào một lúc nào đó khi cuộc gọi ajax thực sự trả lời phản hồi. Đây là một điểm cơ bản về bản chất không đồng bộ của ajax: mã trong các hàm đóng không chạy theo trình tự với mã xung quanh nó. Đây là một điều quan trọng để nắm bắt khi tìm hiểu về mã hướng sự kiện.
Spudley

Cách để có được console.log chính xác hơn trong trường hợp này sẽ là đặt nó bên trong hàm thành công ajax.
DWils

Một trong những hiểu biết tuyệt vời của tôi: kiểm tra chính tả và trường hợp của tên biến. Rất dễ bỏ lỡ một cái gì đó đơn giản như sessionId vs sessionID.
ngựa trắng

Tôi có cùng một vấn đề về những điều này. Nhưng cuối cùng cũng hiểu, cảm ơn @Spudley!
Yudhistira Bayu

62
var a = 10;

myFunction();

function myFunction(){
   a = 20;
}

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

1
cảm ơn vì ví dụ đơn giản tuyệt vời này Logic của việc này đang làm tôi suy nghĩ. Chỉ cần làm quen với suy nghĩ 4d.
Mikey3Strings

29

Chỉ cần sử dụng tên của biến đó.

Trong JavaScript, các biến chỉ cục bộ đối với một hàm, nếu chúng là (các) tham số của hàm hoặc nếu bạn khai báo chúng là cục bộ rõ ràng bằng cách nhập vartừ khóa trước tên của biến.

Nếu tên của giá trị cục bộ có cùng tên với giá trị toàn cục, hãy sử dụng windowđối tượng

Xem jsfiddle này

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

Biên tập

Với ES2015 đã xuất hiện thêm hai từ khóa constletđiều này cũng ảnh hưởng đến phạm vi của một biến ( Đặc tả ngôn ngữ )


1
+1 để mô tả xung đột tên giữa biến toàn cục và biến khai báo cục bộ và cách truy cập nó.
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>

Chỉ cần không sử dụng vartừ khóa bên trong hàm, sau đó bạn không phải xử lý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

Với window [' biếnName '] hoặc window.variableName, bạn có thể sửa đổi giá trị của biến toàn cục bên trong hàm.


Đây là cách duy nhất tôi có thể thay đổi giá trị biến toàn cục trong thành phần góc !!!
Padmaraj Bhat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.