Điều này hoạt động trong trường hợp có 'var' vì biến dừng trong độ phân giải phạm vi được tạo. Nếu không có 'var' bạn chỉ cần chạy ra ngoài tìm kiếm thông qua các chuỗi phạm vi và bạn nhận được thông báo. Nếu bạn thực sự muốn sử dụng một biến toàn cầu:
// This is fine because assignment always sets a property value
// in this case (no 'var ga') it's the same as window.ga = window.ga || []
ga = window.ga || []
Hoặc:
// Once again, only the lookup is affected with "running off"
// the lookup chain. It's not that the variable has no value --
// the problem is there IS NO VARIABLE.
if (!window.ga) {
ga = []
}
Hoặc ngay cả điều này:
// First line is the same as window.ga = window.ga,
// but now the property ga is guaranteed to exist on the window object --
// the VALUE of the property may (still) be undefined
ga = window.ga
ga = ga || []
Lưu ý rằng trong cả hai trường hợp này tôi dứt khoát gọi ga
như một thuộc tính của đối tượng window
(toàn cầu).
Bạn có thể đọc về các chi tiết ở đây: Identifier Resolution, Execution Contexts and Scope Chains.
Vị trí của var trong phạm vi không quan trọng.Tất cả những điều sau đây đều giống nhau:
var ga
ga = ga || []
var ga = ga || []
ga = ga || []
var ga
Nguồn
2010-04-21 03:43:56
Ý của bạn là 'var ga = ga || [] 'vì' ga = ga || []; 'lỗi quá (như S.Mark chỉ ra). – R0MANARMY
Cảm ơn bạn đã chỉ ra điều này. Tôi đã cập nhật câu hỏi. –
Tôi nghĩ rằng đó là ga = ga || oh.la = la; muốn (yourBadRomance); –