Khi nào và ở đâu chúng ta nên sử dụng cẩu trong Javascript [đã đóng]


11

Tôi mới dùng Javascript. Tôi đang tìm hiểu khái niệm cẩu trong Javascript.
Dựa trên các hướng dẫn Javacsript trong trang web Mozilla , tôi đã bắt gặp từ này hoisting. Theo các hướng dẫn đó, các biến trong JavaScript là bạn có thể tham chiếu đến một biến được khai báo sau mà không có ngoại lệ . Nhưng, câu hỏi của tôi là về trường hợp nào là phù hợp để sử dụng cẩu trong Javascript phía máy khách hoặc tại sao chúng ta nên sử dụng cẩu trong Javascript. Ưu điểm của nó là gì.


1
Chia sẻ nghiên cứu của bạn giúp mọi người. Hãy cho chúng tôi những gì bạn đã cố gắng và tại sao nó không đáp ứng nhu cầu của bạn. Điều này chứng tỏ rằng bạn đã dành thời gian để cố gắng tự giúp mình, nó giúp chúng tôi tránh nhắc lại các câu trả lời rõ ràng và hầu hết nó giúp bạn có được câu trả lời cụ thể và phù hợp hơn. Xem thêm Cách hỏi
gnat

6
@gnat Sau tất cả các nghiên cứu, nếu tôi đã hiểu chủ đề này, tại sao tôi lại đăng câu hỏi này ở đây, để thảo luận và hiểu đúng về khái niệm này
Rudra

2
@Rudra Đây không phải là một diễn đàn thảo luận . Hơn nữa, bạn đã không đưa ra bất kỳ bằng chứng nào cho thấy bạn đã thực sự nghiên cứu điều này.
Doval

5
Có, nhưng đó không phải là một yêu cầu để đặt câu hỏi.
Robert Harvey

2
@Rudra: Hãy nhớ rằng chúng tôi không phải là một diễn đàn thảo luận. Chúng tôi thực sự là một trang web hỏi đáp. Các câu hỏi được hỏi ở đây nên được đặt trong phạm vi để có thể trả lời hợp lý trong định dạng Hỏi và Đáp.
Robert Harvey

Câu trả lời:


11

Tôi chưa bao giờ nghe cụm từ "cẩu" được sử dụng. Nếu bạn đang đề cập đến cách sử dụng cẩu này của Ben Cherry: http://www.adequTHERgood.com/JavaScript-Scoping-and-Ho hiện.html , thì từ những gì tôi có thể thu thập được, anh ta chỉ đơn giản lặp lại Douglas Crockford từ Javascript: Phần tốt , và nói rằng bạn không bao giờ nên sử dụng cẩu . Khẳng định của anh ấy ở cuối là tất cả các biến phải được khai báo ở đầu hàm của bạn (như Crockford và JSLint đề xuất).

Hoặc, theo lời của ông ChristopherBrown, đây không phải là một tính năng để sử dụng , mà chỉ đơn giản là một cách giải quyết liên quan đến cách trình duyệt diễn giải Javascript.

Vì vậy, trong ngắn hạn: không bao giờkhông nơi nào .


1
Sau đó, tại sao khái niệm này được bao gồm và tính năng này là gì?
Rudra

@Rudra: Chủ đề "Tuyên bố, Tên và Tời" trong bài viết mà David liên kết dường như đề cập đến vấn đề này khá tốt. Phần nào không rõ ràng?
Robert Harvey

@RobertHarvey Tôi chỉ muốn biết, họ sử dụng cái này ở đâu và khi nào. David nói rằng nó được sử dụng không bao giờ và không ở đâu, nhưng tại sao nó được hiển thị như một tính năng
Rudra

4
Chỉ vì một cái gì đó là một tính năng không có nghĩa đó là một ý tưởng tốt. Có nhiều lý do tại sao "tính năng" không được ưa chuộng. Ngay cả phụ lục của bạn không phục vụ mục đích rõ ràng hữu ích, mặc dù nó có thể đã làm trong những ngày người hang động.
Robert Harvey

1
HO Hiện là một thuật ngữ từ lý thuyết trình biên dịch, đặc biệt là tối ưu hóa. Nó đã tồn tại ít nhất 20 năm, nhưng đã trở nên phổ biến bởi tính đặc thù này của Javascript. Nếu nó không được gọi là một tính năng, nó có thể là một lỗi.
david.pfx

16

Tời kéo mô tả một tính năng về cách Javascript được trình duyệt diễn giải và không quá nhiều tính năng được sử dụng.

Khi diễn giải Javascript, trình duyệt phạm vi biến cấp độ chức năng ở đầu hàm. Thí dụ:

function AddTwoAndTwo() {
    var two = 2;
    var result = two + two;
    return result;
}

Trong mã được đăng, cả hai biến "hai" và "kết quả" đều tồn tại ở đầu phạm vi hàm (rõ ràng, như chúng được khai báo ở đó.) Tuy nhiên, vì các trình duyệt đang "nâng" các biến, nên sau đây trở thành mã Javascript hợp pháp .

function AddTwoAndTwo() {
    result = 5;
    alert(result);
    var two = 2;
    var result = two + two;
    return result;
}

Hiệu ứng ròng ở đây là bạn có các biến được sử dụng trước khi bạn khai báo chúng và điều đó có thể gây nhầm lẫn, đặc biệt là với các biến phạm vi toàn cầu. Thí dụ:

var result = 6;

function AddTwoAndTwo() {
    alert(result);  // should this be 6 or undefined?
    var two = 2;
    var result = two + two;
    return result;
}

Để tránh nhầm lẫn, hãy khai báo các biến của bạn ở đầu hàm.


4
+1: đây là cách tôi sẽ trả lời. Đây không phải là một tính năng để sử dụng hay không sử dụng, đây chỉ là một tính chất của môi trường.
Scrwtp

1

Tại sao?

JavaScript không có Phạm vi chặn , điều đó sẽ giải thích lý do tại sao mọi thứ nên nâng lên hàng đầu.

Nó khá hữu ích?

Nếu bạn thích điều này:

var someVariable = someVariable || {};

Thay vì điều này:

if ( "undefined" !== typeof someVariable ) {
    someVariable = someVariable;
} else {
    someVariable = {};
}

Sau đó, nó là hữu ích. Ngay cả khi bạn không chú ý đến nó!

Thanh toán bù trừ

Ví dụ đầu tiên sẽ dịch sang một cái gì đó như thế này:

var someVariable = someVariableValue;

if ( "undefined" !== typeof someVariable ) {
    var someVariableValue = someVariable;
} else {
    var someVariableValue = {};
}
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.