Ngôn ngữ lập trình đặc thù, Phần 2: JavaScript


Phạm Hữu Ðạt
4 năm trước
Hữu ích 5 Chia sẻ Viết bình luận 0
Đã xem 6640

Tuần trước tôi đã viết về một số tuyên bố kỳ lạ được coi là đúng về mặt cú pháp trong Ruby. Tuần này tôi sẽ viết về đặc thù phạm vi chức năng với JavaScript.

Chức năng

Đầu tiên, có một số cách bạn có thể định nghĩa các hàm trong JavaScript chẳng hạn:

// A named function
function example1() {};

// An anonymous function variable assignment.
var example2 = function() {};

// A named function variable assignment
example3 = function example3() {};

Để một hàm có thể lặp lại tuy nhiên ví dụ thứ ba của phép gán biến hàm được đặt tên phải được sử dụng như trong ví dụ dưới đây.

var i = function i(val) {
counter = val + 1
console.log(val);
if (counter < 100)
i(counter)
}(1)

Trong ví dụ này, bạn cũng có thể thấy đó là một hàm tự gọi vì định nghĩa được theo sau bởi dấu ngoặc chứa giá trị tham số.

Dưới đây bạn có thể thấy một ví dụ trong đó thế giới hàm được gọi trước khi được khai báo, điều này hoàn toàn chấp nhận được trong JavaScript.

function hello() {
  console.log('hello');
  world();
  function world() {
    console.log('World');
  }
};

hello();

Đối tượng đầu hoặc toàn cầu

Trong một trình duyệt, nó sẽ được gọi là Window trong khi trong Node.JS, nó được gọi là đối tượng toàn cầu.

Đối tượng đầu hành xử hơi khác nhau từ thực hiện này sang thực hiện khác. Tùy thuộc vào cách bạn khai báo một biến trong Node.js ảnh hưởng đến khả năng hiển thị của nó.

var example1 = function() {};
example2 = function() {};
function example3() {};
example4 = function example4() {};
var example5 = function example5() {};
console.log('example1' in global); // returns false
console.log('example2' in global); // return true
console.log('example3' in global); // returns false
console.log('example4' in global); // return true
console.log('example5' in global); // return false
console.log(global);

Trong ví dụ trên bạn có thể thấy rằng:

  • Ví dụ1 không phải là một phần của đối tượng đầu vì biến được khai báo, hàm không được bao gồm trong đối tượng đầu bất kể thực tế nó được khai báo ở cấp đầu.

  • Ví dụ2 là một phần của đối tượng đầu vì nó chưa được khai báo, nó trở thành một phần của đối tượng đầu.

  • Ví dụ3 là một hàm được đặt tên mà mặc dù có thể truy cập từ bất kỳ đâu vì nó có phạm vi toàn cục, nó không phải là một phần của đối tượng đầu.

  • Ví dụ4 là một phần của đối tượng đầu vì lý do tương tự như Ví dụ2.

  • Ví dụ5 một lần nữa không phải là một phần của đối tượng toàn cầu vì nó đã được khai báo.

Bây giờ cho một ví dụ thậm chí còn xa lạ mà các ví dụ trên.

Example6 = function example6() {};
console.log('Example6' in global);
var Example6;

Tôi sẽ để nó cho bạn đoán những gì xảy ra ở đây ... Tôi sẽ chỉ nói mặc dù nó khiến tôi bối rối.

Bạn cũng có thể vui vẻ cố gắng tìm ra đoạn mã sau sẽ xuất ra:

function a() {
function b() {}
var c = "var c";
}

d = function() {
e = "var e";
f = function() {
console.log("function f");
}
}

var i = function() {
console.log("Global function i is in head:" + (i in global));
}

function g() {
h = function() {
console.log("function h");
i = function() {
console.log("function i");
}
}
var i;
h();
console.log(i);
i();
}

try {
f();
} catch (ex) {
console.log(ex);
}

try {
d();
} catch (ex) {
console.log(ex);
}

try {
f();
} catch (ex) {
console.log(ex);
}

try {
g();
} catch (ex) {
console.log(ex);
}

try {
h();
} catch (ex) {
console.log(ex);
}

try {
i();
} catch (ex) {
console.log(ex);
}

try {
console.log(e);
} catch (ex) {
console.log(ex);
}
Hữu ích 5 Chia sẻ Viết bình luận 0
Đã xem 6640