19

Tôi có một chức năng đăng nhập đơn giản:Tại sao các hàm có thể được gọi mà không có dấu ngoặc đơn khi sử dụng chuỗi mẫu?

function log(str) { 
    console.log('logged: ', str); 
} 

Nếu tôi gọi nó mà không có dấu ngoặc đơn (hiện đang sử dụng các công cụ dev của Chrome) và vượt qua trong một mẫu chuỗi, như thế này:

log`foo` 

Đầu ra là: logged: ["foo", raw: Array[1]]

Nếu tôi gọi nó với dấu ngoặc đơn,

log(`foo`) 

Đầu ra là: logged: foo

Tại sao gọi một hàm bằng chuỗi mẫu không có dấu ngoặc đơn hoạt động trong Javascript? Điều gì đang xảy ra khiến cho kết quả khác với việc gọi nó bằng dấu ngoặc đơn?

Trả lời

21

Ví dụ đầu tiên (log`foo`) cho phép đặc tả ngôn ngữ xác định các giá trị được chuyển đến hàm nhật ký (Xem 12.3.7). Ví dụ thứ hai (log(`foo`)) chuyển một cách rõ ràng một đối số.

Văn bản mẫu có thể chứa chuỗi, cũng như biểu thức. Đôi khi bạn có thể có quyền kiểm soát nhiều hơn đối với việc biên dịch chuỗi từ các phần chuỗi và các phần biểu thức của nó. Trong trường hợp này, bạn có thể đang tìm kiếm các mẫu được gắn thẻ.

var name = "Jonathan"; 
var mssg = foo `Hello, ${name}. Nice name, ${name}.`; 

function foo (strings, ...values) { 
    console.log(strings); //["Hello, ", ". Nice name, ", ".", raw: Array[3]] 
    console.log(values ); //["Jonathan", "Jonathan"] 
} 

Lưu ý ở đây cách tất cả các chuỗi được chuyển qua đối số đầu tiên. Đồng thời, tất cả các biểu thức giá trị nội suy được truyền qua phần còn lại của các tham số (được kéo vào nhau thành một mảng ở đây).

Với điều khiển bổ sung này, chúng tôi có thể làm đủ mọi thứ, chẳng hạn như bản địa hóa. Trong ví dụ này, đặc tả ngôn ngữ xác định các giá trị thích hợp để chuyển đến hàm — nhà phát triển không xác định điều này.

Để tương phản, khi bạn gọi log(foo), bạn sẽ chỉ nhận được chỉ chuỗi kết quả. Không có đối tượng, không có bộ phận, không có giá trị thô.

+1

Đáng giá thêm liên kết, vì tôi chưa từng nghe về điều này trước đây: https://developers.google.com/web/updates/2015/01/ES6-Template-Strings#tagged-templates – Mathletics

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