2012-06-10 31 views
14

Không bao giờ gặp vấn đề này, và không biết tại sao. Giải thích duy nhất là vấn đề phạm vi.javascript xác định phạm vi bằng thẻ tập lệnh?

Trong cùng một trang, tôi có 2 phần của JS:

... 
<script type="text/javascript"> 
    go(); 
    </script> 

    <script type="text/javascript"> 
    function go() 
    { alert(''); } 
    </script> 
... 

này sẽ hiển thị một lỗi: đi không được định nghĩa

nơi

... 
    <script type="text/javascript"> 
     go(); 

     function go() 
     { alert(''); } 
     </script> 
    ... 

là làm việc (rõ ràng).

Thẻ <script> có tạo phạm vi JS không? trợ giúp?

+7

bằng cách sử dụng thẻ tập lệnh, trước tiên bạn nên xác định hàm và sau đó gọi hàm đó. – undefined

Trả lời

20

Đây không phải là vấn đề phạm vi. Nếu bạn định nghĩa một hàm (trong phạm vi toàn cục) trong một phần tử script, thì bạn có thể sử dụng nó trong một phần tử khác.

Tuy nhiên, các phần tử tập lệnh được phân tích cú pháp và thực thi khi chúng được gặp phải.

Hoisting sẽ không hoạt động trên các phần tử tập lệnh. Một hàm được định nghĩa trong phần tử tập lệnh sau sẽ không khả dụng trong lần chạy đầu tiên của phần tử tập lệnh trước đó.

Bạn cần trao đổi thứ tự các phần tử tập lệnh của mình hoặc trì hoãn cuộc gọi hàm cho đến sau tập lệnh xác định nó đã chạy (ví dụ: bằng cách đính kèm nó vào một trình xử lý sự kiện onload).

<script> 
    function go() { 
     alert(''); 
    } 
</script> 
<script> 
    go(); 
</script> 

hoặc

<script> 
    window.addEventListener("load", function() { 
     go(); 
    }, false); 
</script> 
<script> 
    function go() { 
     alert(''); 
    } 
</script> 
+0

mã đầu tiên của bạn không hoạt động ... (giống như mẫu của tôi) có phải bạn muốn viết mã đó không? –

+1

Ví dụ đầu tiên của bạn vẫn còn sai đường xung quanh :) – floorish

+0

@floorish - Rất tiếc. Cảm ơn vì đã bắt! – Quentin

7

Các phân tích cú pháp html dừng để thực hiện kịch bản của bạn trước khi chuyển đến các yếu tố tiếp theo. Vì vậy, phần tử script tiếp theo không được thực hiện cho đến khi phần tử đầu tiên được thực hiện.

này được so sánh với:

<script> 
document.getElementById("hello") //null because the html parser hasn't met the div yet. 
</script> 
<div id="hello"></div> 
1

Nguyên nhân khác về điều này như một lỗi rõ ràng là nếu khối kịch bản đầu tiên có lỗi cú pháp và bị từ chối một cách trọn vẹn, nhưng khối thứ hai chạy trên và bỏ lỡ mã bạn thân của nó.

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