Skip to main content

Command Palette

Search for a command to run...

CTN 10. Function hoisting, closure, Object.create()

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.

Bài 1

const id = 10;

const getID = (...id) => {
  id(id);

  function id(id) {
    console.log(typeof id);
  }
};

getID(id);

Lời giải

const id = 10;

const getID = (id) => {
  id(id);

  function id(id) {
    console.log(typeof id);
  }
  // function được khai báo trong function, tức là chúng ta đang làm việc với closure
  // function id được hoisting
};

getID(id);
// gọi hàm id(id) // tính chất closure thể hiện là hàm id(id) vẫn nhớ được scope thực thi của nó trong getId function
// trong hàm id, in ra type của id (ở đây id chính là function id, do đã được hoisting)
// => kết quả: function

Kiến thức liên quan:

  • Closure
  • Hoisting

Bài 2

var book1 = {
  name: "Name of the rose",
  getName: function () {
    console.log(this.name);
  },
};

var book2 = {
  name: { value: "Harry Potter" },
};

var bookCollection = Object.create(book2);
// Cú pháp Object.create(proto) | Object.create(proto, propertiesObject)
// => ở đây book2 chỉ là "propertiesObject", tức là nó được sử dụng để định nghĩa thuộc tính trong book1
// => thuộc tính name của book1 sẽ được khai báo với value = "Harry Potter"

bookCollection.getName();
// => console.log(this.name) = "Harry Potter"

Lời giải:

var book1 = {
  name: "Name of the rose",
  getName: function () {
    console.log(this.name);
  },
};

var book2 = {
  name: { value: "Harry Potter" },
};

var bookCollection = Object.create(book2);
// Cú pháp Object.create(proto) | Object.create(proto, propertiesObject)
// => ở đây book2 chỉ là "propertiesObject", tức là nó được sử dụng để định nghĩa thuộc tính trong book1
// => thuộc tính name của book1 sẽ được khai báo với value = "Harry Potter"

bookCollection.getName();
// => console.log(this.name) = "Harry Potter"

Kiến thức liên quan:

  • Object.create(proto) hoặc Object.create(proto, propertiesObject)

Bài 3

(() => {
  const a = Object.create({});
  const b = Object.create(null);

  let f1 = a.hasOwnProperty("toString"); 

  let f2 = "toString" in b;

  let result =
    f1 === false && f2 === false
      ? console.log((typeof a.toString()).length)
      : console.log(b.toString());
})();

Lời giải:

(() => {
  const a = Object.create({}); // a sẽ là một object rỗng (vẫn bao gồm các thuộc tính build-in của object)
  const b = Object.create(null); // b sẽ là một object rỗng (KHÔNG bao gồm các thuộc tính build-in của object)

  let f1 = a.hasOwnProperty("toString"); 
  // hasOwnProperty là một method của object để lấy ra các thuộc tính (KHÔNG bao gồm các thuộc tính build-in)
  // nằm trong object đó
  // toString là một build-in method của object
  // => kết quả: false

  let f2 = "toString" in b;
  // => kết quả: false

  let result =
    f1 === false && f2 === false
      ? console.log((typeof a.toString()).length) // => kết quả: 6
      : console.log(b.toString());
})();

Kiến thức liên quan:

  • Object.create(null)
  • Object.prototype.toString()
54 views

More from this blog

zujs

35 posts