2013-02-01 28 views

Trả lời

4

Bất kỳ biểu tượng nào trong số các biểu tượng này chuyển chức năng theo sau thành biểu thức hàm, thay vì khai báo hàm. Đặt tất cả chúng vào đó cùng nhau chỉ để cho vui.


Nếu bạn cố gắng để gọi một chức năng thường xuyên bằng cách đặt () ngay sau khi tuyên bố:

function() { 
    // this is a syntax error... 
}(); 

bạn sẽ nhận được một lỗi cú pháp:

SyntaxError: Unexpected token (

kể từ khi bạn không thể gọi một khai báo hàm.


Vì vậy, mọi người thường quấn một chức năng ẩn danh trong ngoặc đơn để biến nó thành một biểu hiện chức năng:

(function() { 
    // this will execute immediately 
}()); 

Bạn có thể đạt được điều tương được thêm vào trước bất kỳ của những biểu tượng:

!function() { 
    // this will also execute immediately 
}(); 

Để biết thêm thông tin, hãy xem tại đây: http://kangax.github.com/nfe/#expr-vs-decl

0

Không có điểm nào để thực hiện các biểu tượng dài, ngoại trừ dạng hình mờ phong cách.

Tập hợp các biểu tượng đó hoạt động như một thao tác trên hàm theo sau, nhưng không làm gì cả.

Trong JS bạn có thể viết 1 hoặc +1 (một) hoặc !1 (sai) hoặc +1 (vẫn sai). Đây chỉ là một chuỗi dài những người đang hành động theo chức năng sau đây.

Vì vậy, !+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!1 không phát sinh lỗi. Giá trị của nó là false.

!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!function(){ ... } chỉ thực hiện chức năng và ước lượng là false (nhưng không được thực hiện với giá trị anyway)

Tuy nhiên, vì một cái gì đó là có, nó quay định nghĩa hàm thành một hoạt động và đánh giá chức năng ngay lập tức. Nhưng chỉ +function(){ ... } sẽ làm điều tương tự.

0

Để xây dựng thêm một chút, mỗi toán tử này sẽ thực sự thực hiện cưỡng chế kiểu trên toán hạng tiến hành nó. + sẽ chuyển đổi toán hạng theo sau thành number, cũng như toán tử -. ! là toán tử không phải và sẽ chuyển đổi toán hạng thành boolean (true/false).

Một điều cần nhớ là trong Javascript, mọi thứ đều có thể đánh giá một số loại giá trị. Đó có thể là giá trị "trung thực" hoặc "falsey" và cũng có thể có giá trị "số" (ngay cả khi giá trị đó không phải là số, AKA NaN). Vì vậy, nếu bạn mở JSFiddle, hoặc Firebug và gây rối xung quanh với những giá trị này hoạt động, bạn có thể thấy rằng chúng cũng mang lại một số giá trị trả về mới.

Ví dụ:

  1. !function(){} sẽ đánh giá một giá trị của false (vì ép buộc một đối tượng chức năng để một boolean mang lại một giá trị của true).
  2. +function(){} sẽ đánh giá thành giá trị NaN (do việc cố định đối tượng hàm cho một số sản lượng là NaN). Cùng một kết quả có thể được nhìn thấy bằng cách sử dụng -.
  3. !+function(){} mang đúng (ép buộc một số giá trị NaN sẽ mang lại false và không lãi suất sai sự thật.
  4. !+-+-+!function(){} mang lại thật sự (vì !function(){} sản lượng false, +false sản lượng 0, và sẽ tiếp tục trong suốt tất cả những +- nhà khai thác cho đến khi được đánh giá là đúng)
  5. Áp dụng các toán tử như được liệt kê trong ví dụ của bạn sẽ chuyển qua lại giữa false, -1, 0, 1, true cho đến khi tất cả toán tử đã được đánh giá .

Lưu ý rằng tôi đã kiểm tra chúng bằng Firebug. Có thể có sự khác biệt giữa các trình duyệt và có lẽ Firebug sẽ cho chúng ta biết về đánh giá. TL; DR là Javascript thực hiện rất nhiều loại cưỡng chế, và sẽ đánh giá các biểu thức khác với các khai báo.

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