2014-05-13 16 views
8

Rất đơn giản kịch bản:Gọi javascript chức năng từ nhà phát triển chrome console

function foo(){ 
    return "bar" 
} 

console.log(foo()); 

console:

> bar // sanity test that proves everything's working 
> foo(); // this guy is key! 
> ReferenceError: foo is not defined 

Làm thế nào tôi nên gọi foo(); cho mục đích gỡ lỗi và thử nghiệm?

Đây có phải là thực tế không? Tôi thích sử dụng IRB/Rails Console để xác minh mã ruby ​​của tôi và muốn làm điều tương tự với JavaScript

http://jsfiddle.net/m2muL/

+3

'foo' không được công khai tiếp xúc –

+0

tôi thú nhận tôi không chắc chắn 100% những gì bạn có nghĩa là bằng cách đó. Bạn có nghĩa là nó không thể được truy cập từ phạm vi toàn cầu? Và những gì không? – Starkers

+0

Vấn đề ở đây là chúng tôi không thể tái tạo những gì bạn nói mà bạn đang nhìn thấy. – bfavaretto

Trả lời

8

Vấn đề là chức năng foo của bạn không phải là một phần của phạm vi toàn cầu. Giao diện điều khiển về cơ bản có quyền truy cập vào mọi thứ mà window thực hiện. Kết quả là, nếu nó không được định nghĩa ở đó, thì nó không được xác định trong bảng điều khiển. Ví dụ, đây có thể là một ví dụ về foo không có sẵn trong giao diện điều khiển.

(function(){ 
    function foo(){ 
    return "bar"; 
    } 
    console.log(foo()); //"bar" 
})() 

console.log(foo()); //ReferenceError: foo is not defined 

Tìm cách xác định vị trí của phương pháp này. Nếu nó là bên trong của một đối tượng hoặc phương pháp, hãy chắc chắn để tham khảo đó từ giao diện điều khiển của bạn.

var foobar = { 
foo: function(){ return "bar" ;} 
}; 

console.log(foobar.foo()); //"bar" 

Nếu bạn không thể tham chiếu foo, thì bạn không thể gọi nó.

+0

Tôi có thể làm điều này. Nó là một thực hành tốt để tạo ra các đối tượng trong javascript/jquery và lưu trữ các chức năng liên quan bên trong chúng anyway? Thay vì có các hàm chỉ trôi nổi trong phạm vi toàn cục? – Starkers

+0

@Starkers - Thực hành tốt nhất là chỉ có một biến toàn cầu chứa toàn bộ thời gian và định nghĩa của tất cả các chức năng của bạn. Đây là lý do tại sao, để lấy jQuery ví dụ, tất cả các API của họ là dưới '$' hoặc 'jQuery' và đó là lối vào duy nhất. Thông thường điều đó được thực hiện bằng cách nội bộ hóa một mẫu thử nghiệm và trả về một cá thể được xây dựng. –

2

Bạn đang cố thực hiện điều này trong JSFiddle, đó là "ẩn" javascript của bạn khỏi bảng điều khiển. Nó không thực sự trong phạm vi để bạn thực hiện. Nó không hoạt động ở đó giống như bạn đang giả sử nó sẽ ...

Nếu bạn tạo một tệp HTML đơn giản và cắm javascript vào giữa các thẻ, bạn sẽ không gặp sự cố khi chạy "foo()" trong bảng điều khiển.

Tạo test.html và đặt bên này:

<script> 
function foo(){ 
    return "bar" 
} 
console.log(foo()); 
</script> 
+0

http://jsfiddle.net/m2muL/1/ Không làm việc cho tôi tôi sợ. – Starkers

+0

Tôi nhận được 'bar'' bar' như tôi mong đợi, nhưng khi chạy 'foo();' tôi nhận được lỗi không xác định? – Starkers

+0

Không chắc chắn nếu chúng tôi đang làm điều tương tự. Mở notepad, dán vào mã trong câu trả lời của tôi, lưu dưới dạng test.Html. Sau đó, mở test.html trong chrome, mở bảng điều khiển và nhập "foo();" –

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