Dấu gạch chéo gọi một hàm


93

Tôi không chắc làm thế nào để giải thích điều này, nhưng khi tôi chạy

console.log`1`

Trong google chrome, tôi nhận được kết quả như

console.log`1`
VM12380:2 ["1", raw: Array[1]]

Tại sao backtick gọi hàm log và tại sao nó tạo chỉ mục raw: Array[1]?

Câu hỏi được đưa ra trong phòng JS bởi Catgocat, nhưng không có câu trả lời nào hợp lý ngoài điều gì đó về chuỗi tạo mẫu không thực sự phù hợp tại sao điều này lại xảy ra.


Câu trả lời:


67

Nó được gọi là Tagged Template trong ES-6 có thể đọc thêm về chúng Ở đây , thật buồn cười khi tôi tìm thấy liên kết trong phần có dấu sao của cuộc trò chuyện.

Nhưng phần có liên quan của mã ở bên dưới (về cơ bản bạn có thể tạo một loại được lọc).

function tag(strings, ...values) {
  assert(strings[0] === 'a');
  assert(strings[1] === 'b');
  assert(values[0] === 42);
  return 'whatever';
}
tag `a${ 42 }b`  // "whatever"

Về cơ bản, nó chỉ gắn thẻ "1" với hàm console.log, như nó sẽ làm với bất kỳ hàm nào khác. Các hàm gắn thẻ chấp nhận các giá trị được phân tích cú pháp của các chuỗi mẫu và các giá trị riêng biệt mà các tác vụ khác có thể được thực hiện.

Babel chuyển đoạn mã trên thành

var _taggedTemplateLiteralLoose = function (strings, raw) { strings.raw = raw; return strings; };

console.log(_taggedTemplateLiteralLoose(["1"], ["1"]));

Như bạn có thể thấy trong ví dụ trên, sau khi được chuyển đổi bởi babel, hàm gắn thẻ (console.log) đang được chuyển giá trị trả về của mã chuyển tiếp es6-> 5 sau đây.

_taggedTemplateLiteralLoose( ["1"], ["1"] );

Giá trị trả về của hàm này được chuyển tới console.log, sau đó sẽ in mảng.


10
Tôi thấy điều này là dễ dàng hơn nhiều để hiểu explanantion- wesbos.com/tagged-template-literals
Dave Cọc

34

Mẫu được gắn thẻ theo nghĩa đen:

Cú pháp sau:

function`your template ${foo}`;

Được gọi là mẫu được gắn thẻ theo nghĩa đen.


Hàm được gọi là một mẫu được gắn thẻ theo nghĩa đen nhận các đối số của nó theo cách sau:

function taggedTemplate(strings, arg1, arg2, arg3, arg4) {
  console.log(strings);
  console.log(arg1, arg2, arg3, arg4);
}

taggedTemplate`a${1}b${2}c${3}`;

  1. Đối số đầu tiên là một mảng gồm tất cả các ký tự chuỗi riêng lẻ
  2. Đối số còn lại tương ứng với giá trị của các biến mà chúng ta nhận được thông qua nội suy chuỗi. Lưu ý trong ví dụ rằng không có giá trị cho arg4(vì chỉ có 3 lần nội suy chuỗi) và do đó undefinedđược ghi lại khi chúng tôi cố gắng đăng nhậparg4

Sử dụng cú pháp tham số còn lại:

Nếu chúng ta không biết trước bao nhiêu lần nội suy chuỗi sẽ diễn ra trong chuỗi mẫu, thì việc sử dụng cú pháp tham số còn lại thường rất hữu ích. Cú pháp này lưu trữ các đối số còn lại mà hàm nhận được vào một mảng. Ví dụ:

function taggedTemplate(strings, ...rest) {
  console.log(rest);
}

taggedTemplate `a${1}b${2}c${3}`;
taggedTemplate `a${1}b${2}c${3}d${4}`;

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.