2009-12-08 18 views
6

Tôi mới sử dụng JavaScript.Có mục đích nào để xác định lại các biến JavaScript không?

<html> 
<body> 
<script type="text/javascript"> 
var x=5; 
document.write(x); 
document.write("<br />"); 
var x; 
document.write(x); 
</script> 
</body> 
</html> 

Kết quả là:

5 
5 

Khi x được khai báo lần thứ hai nó nên không xác định, nhưng nó giữ giá trị trước đó. Vui lòng giải thích cho dù việc xác nhận lại này có bất kỳ mục đích đặc biệt nào hay không.

+0

Nội dung câu hỏi của bạn là về một ví dụ cụ thể, đã được trả lời đầy đủ dưới đây. Tuy nhiên, tôi thấy rằng [câu trả lời này] (http://stackoverflow.com/a/12889928/983430) cho một câu hỏi tương tự trả lời cho trường hợp chung (khi nào/tại sao lại sử dụng một biến JavaScript được sử dụng?) Được hỏi trong tiêu đề của câu hỏi của bạn thực sự tốt. –

Trả lời

20

Bạn không thực sự khai báo lại biến.

Tuyên bố biến trong JavaScript, tùy thuộc vào xuồng lên, đó có nghĩa là họ được đánh giá ở phân tích thời gian và sau này trong thời gian chạy các bài tập được đưa ra.

Mã của bạn ở phần cuối của giai đoạn phân tích, trước khi thực hiện trông giống như sau:

var x; 
x = 5; 

document.write(x); 
document.write("<br />"); 
document.write(x); 
+0

Cảm ơn bây giờ tôi rõ ràng – Warrior

0

Theo như hiểu biết của tôi về javascript, việc sử dụng từ khóa var là hoàn toàn tùy chọn trong phạm vi toàn cầu. Đó là một câu chuyện khác cho các chức năng.

Khi bên trong một hàm, sử dụng từ khóa var để cho biết rằng biến là cục bộ cho hàm (trái ngược với toàn cục theo mặc định).

Cá nhân tôi sử dụng var trong phạm vi toàn cầu để cho biết rằng biến đang được khai báo và/hoặc sử dụng lần đầu tiên.

Bạn có thể tham khảo http://www.w3schools.com/js/js_variables.asp để biết thêm thông tin.

+2

không có nó không phải là: mà không chỉ định 'var', một biến sẽ nằm trong phạm vi toàn cục. – jldupont

+0

var được sử dụng cho phạm vi bên trong một hàm, bên trong một hàm nếu bạn không sử dụng var nó sẽ tự động toàn cục. –

+0

heh - tất cả trong cùng 20 giây. –

1

vì vậy khi lần thứ hai khi x tuyên bố của nó nên được undefined

gì một phần của đặc tả nói điều này?

"Hành vi chưa xác định" không có nghĩa là "biến sẽ là undefined".

0

Biến thứ hai var x đó hoàn toàn không cần thiết.

0

Trong phạm vi cùng phạm vi, hoàn toàn không cần thiết để "redeclare" biến.

0

Ngoài ra, một lập trình viên có thể muốn sử dụng var để bản địa hoá một biến:

<script> 
var x= 'this is global x'; 
function my_x() { 
var x= 'localized x'; 
alert(x); 
} 
my_x(); 
alert(x); 
</script> 
+0

Mặc dù điều này là có thể và một mô tả rất tốt về nó, tôi không chắc chắn rằng đây là một thực hành rất tốt để có được thành, tên biến thường không nên lặp đi lặp lại với khác nhau sử dụng. – Jay

0

Bạn nên không bao giờ redeclare một biến trong phạm vi tương tự, nếu bạn thực sự muốn thay đổi điều này sau đó gán cho nó. Khai báo lại là không cần thiết để tạo ra một đối tượng khác nhau trong ngôn ngữ năng động này, nếu bạn muốn x là một chuỗi chỉ gán:

x = "hello"; 

Nó không phải là bắt buộc mà bạn đặt nó trở lại undefined hoặc redeclare đầu tiên.

Xin lưu ý rằng việc thay đổi loại biến không thực sự tốt trong hầu hết các trường hợp, chỉ cần nói rằng đó là khả năng nếu đó là những gì bạn yêu cầu.

7

var mình không thực hiện bài tập. Nó chỉ cờ khi bạn sử dụng tên biến trong phạm vi mà trong đó các var xảy ra, bạn đang nói về một biến địa phương và không toàn cầu (mặc định gây tranh cãi). Các var được phát hiện khi chức năng được phân tách và giữ suốt phạm vi đó, vì vậy mà bạn đặt nó là không thích hợp:

var a= 0; 

function foo() { 
    a= 1; 
    return a; 
    var a; 
} 

var b= foo(); 
alert('global a='+a+', local a='+b); 

Kết quả trong global a= 0, local a= 1: mặc dù tuyên bố var không bao giờ đạt được trong quá trình thực hiện foo(), vẫn còn hiệu quả khi thực hiện a biến cục bộ.

Vì vậy, khai báo var x lần thứ hai trong cùng một phạm vi là hoàn toàn dư thừa. Tuy nhiên, đôi khi bạn vẫn có thể làm điều đó, thường là khi bạn sử dụng lại tên biến cục bộ cho lần sử dụng độc lập thứ hai trong cùng một hàm. Phổ biến nhất:

for (var i= 0; i<onething.length; i++) { 
    ...do some trivial loop... 
} 

for (var i= 0; i<anotherthing.length; i++) { 
    ...do another trivial loop... 
} 

Trong khi bạn chắc chắn có thể bỏ qua thứ hai var, và các công cụ như jslint sẽ yêu cầu bạn làm như vậy, nó có thể không thực sự là một ý tưởng tốt.

Hãy tưởng tượng bạn sau đó thay đổi hoặc xóa vòng lặp đầu tiên để nó không còn tuyên bố i thành var nữa. Bây giờ vòng lặp thứ hai còn lại đột nhiên thay đổi ý nghĩa từ một biến cục bộ thành một biến toàn cầu. Nếu bạn không chú ý khi cập nhật vòng lặp đầu tiên vòng lặp thứ hai có sự phụ thuộc ẩn vào nó (và bạn có thể không nhận thấy rõ rằng làm thế nào mà mắt tách hình mẫu for(...=0 ; ...<...; ...++) thành “oh, đó chỉ là một trình lặp chuẩn”), bạn đã có một vấn đề phức tạp và khó chịu để gỡ lỗi.

0

Gần đây tôi đã viết mã như:

var obj1 = get_an_object(); 
var v = obj1.get_velocity(); 
v += changes_in_velocity(); 
obj1.set_velocity(v); 

var obj2 = get_an_object(); 
var v = obj2.get_velocity(); 
v += changes_in_velocity(); 
obj2.set_velocity(v); 

(Mã thực tế là phức tạp hơn và ít lặp đi lặp lại)

Cho đến nay như trình duyệt là có liên quan, các var v tuyên bố thứ hai là dư thừa và vô nghĩa. Đối với tôi, nó phục vụ hai mục đích. Nó nói để quên tất cả mọi thứ tôi biết về cũ v, bởi vì đây là một cách sử dụng mới. Và nó có nghĩa là tôi có thể sắp xếp lại mã, hoặc nhận xét trong nửa đầu, mà không phá vỡ mọi thứ.

Các vấn đề liên quan