Skip to main content

Command Palette

Search for a command to run...

CTN 02. Hoisting và Rest parameters

Published
3 min read

Hello! I'm Zu.Doan

Series này mình muốn rèn luyện khả năng suy nghĩ và giải bài tập, qua đó để hiểu rõ hơn các khái niệm của Javascript. Mình tham khảo các bài tập từ link này.

Bài 1. Xác định kết quả

(function js(x) {
  const y = (j) => j * x;

  console.log(y(s()));

  function s() {
    return j();
  }

  function j() {
    return x ** x;
  }
})(3);

Lời giải:

(function js(x) {
  const y = (j) => j * x; // j = x^x => j * x = x^(x+1)

  console.log(y(s())); // In ra kết quả trả về của hàm y(x^x)

  function s() {
    return j(); // Trả về kết quả của hàm j() => trả về x^x
  }

  function j() {
    return x ** x; // Trả về x^x
  }
})(3); // x = 3 => kết quả = 3^4 = 81

Kiến thức liên quan:

  • Hoisting sẽ ưu tiên theo thứ tự declare function > variable do đó ta có thể thấy là các fn j(), s() được viết ở phía dưới const y nhưng chương trình vẫn nhận biết được và giá trị trả về của các fn đó.

Bài 2

const x = function (...x) {
  let k = (typeof x).length;
  let y = () => "freetut".length;
  let z = { y: y };

  return k - z.y();
};

console.log(Boolean(x()));

Lời giải:

const x = function (...x) {
  let k = (typeof x).length;
  let y = () => "freetut".length;
  let z = { y: y };

  return k - z.y();
};

console.log(Boolean(x()));

// gọi hàm x() 
// function (...x){} => x = []; // Rest parameters: x là biến bên trong hàm x()
// typeof x = 'object' : lưu ý ở đây là Array là một dạng Object trong JS
// k = (typeof x).length = 'object'.length = 6
// y = () => "freetut".length; <=> y = () => 7
// z = {y: y} <=> z = {y: () => 7} => z.y() = 7
// k - z.y() = 6 - 7 = -1
// Boolean(x()) <=> Boolean(-1) => true
// lưu ý: Boolean(a) = false khi a = 0/''/null/undefined/false & = true cho tất cả trường hợp còn lại

Kiến thức liên quan:

  • Rest parameters (...x) - là một trong 2 cách sử dụng của three dots trong javascript. (sử dụng trong tham số khai báo của hàm - để tập hợp các phần tử còn lại vào trong một array)
  • Một cách khác để sử dụng three dotsspread operator (sử dụng trong việc để mở rộng một array/object thành một danh sách)

More from this blog

zujs

35 posts

CTN 02. Hoisting và Rest parameters