01/10/2018, 17:34

function declaration và function expression trong JavaScript

Chúng ta có hai kiểu function trong ngôn ngữ JavaScript (ở đây Góc Kinh Nghiệm dùng chính xác từ tiếng Anh cho các bạn dễ hiểu): function declaration và function expression // Function Declaration function test(val){ return val=== true; } // Function Expression var isTest = ...

Chúng ta có hai kiểu function trong ngôn ngữ JavaScript (ở đây Góc Kinh Nghiệm dùng chính xác từ tiếng Anh cho các bạn dễ hiểu): function declaration và function expression

// Function Declaration
function test(val){
    return val=== true;
}

// Function Expression
var isTest = function(val){
    return val === true;
}

Câu hỏi đặt ra là: chúng khác nhau chỗ nào?

function declaration vs function expression

Sự khác nhau đó là: function declaration có thể được lôi cổ gọi dùng bất cứ khi nào, bất cứ chỗ nào bởi bộ phân tích (interpreter) của trình duyệt. JavaScript biết sự có mặt của nó và parse nó trước khi chương trình JavaScript của chúng ta thực thi. Nói một cách khác (trừu tượng hơn) đó là JavaScript đưa các function loại này lên trên top của scope hiện tại. Làm một cái ví dụ cho dễ hiểu

myFunc();
function myFunc (){
	alert(“Hello Góc Kinh Nghiệm”);
}

Ở ví dụ trên chúng ta thấy hàm test() được gọi trước khi nó được khai báo. Tuy nhiên, chúng ta cũng có thể viết dạng như sau cũng được:

function myFunc (){
	alert(“Hello Góc Kinh Nghiệm”);
}
myFunc();

Còn function expression thì sao? Nó không được JavaScript đánh giá cho đến khi nó được gán vào biến. Hơi trừu tượng một tí, chúng ta làm cái ví dụ cho dễ hiểu

// Báo lỗi nè!
expression();
var expression = function (){
	alert(“Gọi tui là lỗi nha mấy chú”);
}

Nếu các bạn chạy đoạn mã trên thì sẽ báo lỗi vì expression được gọi trước khi nó được khai báo. Để chạy được, chúng ta phải viết lại như sau:

var expression = function (){
	alert(“Gọi tui là lỗi nha mấy chú”);
}
expression();

Tóm lại thì sao: function declaration thì có thể gọi trước khi khai báo hoặc sau khi khai báo đều được, còn function expression thì phải có trình tự. Thế thôi :)


0