Hướng dẫn javascript call function without parentheses - hàm gọi javascript không có dấu ngoặc đơn

Có một số cách khác nhau để gọi một chức năng mà không có dấu ngoặc đơn.

Giả sử bạn có chức năng này được xác định:

function greet() {
    console.log('hello');
}

Sau đó, ở đây bằng một số cách để gọi

new constructor[([arguments])]
1 mà không có dấu ngoặc đơn:

1. Là hàm tạo

Với

new constructor[([arguments])]
2, bạn có thể gọi một chức năng mà không có dấu ngoặc đơn:

new greet; // parentheses are optional in this construct.

Từ MDN trên bộ lọc

new constructor[([arguments])]
2:

Cú pháp

new constructor[([arguments])]

2. Như new constructor[([arguments])] 4 hoặc new constructor[([arguments])] 5 thực hiện

new constructor[([arguments])]
4 và
new constructor[([arguments])]
5 là các phương pháp đặc biệt: chúng được gọi là ngầm khi cần chuyển đổi:

var obj = {
    toString: function() {
         return 'hello';
    }
}

'' + obj; // concatenation forces cast to string and call to toString.

Bạn có thể (AB) sử dụng mẫu này để gọi

new constructor[([arguments])]
1 mà không cần dấu ngoặc đơn:

'' + { toString: greet };

Hoặc với

new constructor[([arguments])]
5:

+{ valueOf: greet };

new constructor[([arguments])]
5 và
new constructor[([arguments])]
4 trên thực tế được gọi từ phương thức toprimitive (kể từ ES6), và do đó bạn cũng có thể thực hiện phương pháp đó:

+{ [Symbol.toPrimitive]: greet }
"" + { [Symbol.toPrimitive]: greet }

2.B ghi đè new constructor[([arguments])] 5 trong nguyên mẫu chức năng

Bạn có thể lấy ý tưởng trước đó để ghi đè phương thức

new constructor[([arguments])]
5 trên nguyên mẫu
var obj = {
    toString: function() {
         return 'hello';
    }
}

'' + obj; // concatenation forces cast to string and call to toString.
4:

Function.prototype.valueOf = function() {
    this.call(this);
    // Optional improvement: avoid `NaN` issues when used in expressions.
    return 0; 
};

Một khi bạn đã làm điều đó, bạn có thể viết:

+greet;

Và mặc dù có dấu ngoặc đơn liên quan đến dòng, việc gọi kích hoạt thực tế không có dấu ngoặc đơn. Xem thêm về điều này trong blog "Phương thức gọi trong JavaScript, mà không thực sự gọi chúng"

3. Là máy phát điện

Bạn có thể xác định hàm máy phát (với

var obj = {
    toString: function() {
         return 'hello';
    }
}

'' + obj; // concatenation forces cast to string and call to toString.
5), trả về một trình lặp. Bạn có thể gọi nó bằng cú pháp lan truyền hoặc với cú pháp
var obj = {
    toString: function() {
         return 'hello';
    }
}

'' + obj; // concatenation forces cast to string and call to toString.
6.

Đầu tiên chúng ta cần một biến thể trình tạo của hàm

new constructor[([arguments])]
1 gốc:

function* greet_gen() {
    console.log('hello');
}

Và sau đó chúng tôi gọi nó mà không có dấu ngoặc đơn bằng cách xác định phương thức @@ iterator:

new greet; // parentheses are optional in this construct.
0

Thông thường các trình tạo sẽ có từ khóa

var obj = {
    toString: function() {
         return 'hello';
    }
}

'' + obj; // concatenation forces cast to string and call to toString.
8 ở đâu đó, nhưng không cần thiết để chức năng được gọi.

Câu lệnh cuối cùng gọi hàm, nhưng điều đó cũng có thể được thực hiện với sự phá hủy:

new greet; // parentheses are optional in this construct.
1

hoặc cấu trúc

var obj = {
    toString: function() {
         return 'hello';
    }
}

'' + obj; // concatenation forces cast to string and call to toString.
9, nhưng nó có dấu ngoặc đơn của riêng mình:

new greet; // parentheses are optional in this construct.
2

Lưu ý rằng bạn cũng có thể thực hiện các điều trên với chức năng

new constructor[([arguments])]
1 ban đầu, nhưng nó sẽ kích hoạt một ngoại lệ trong quy trình, sau khi
new constructor[([arguments])]
1 đã được thực thi (thử nghiệm trên FF và Chrome). Bạn có thể quản lý ngoại lệ với khối
'' + { toString: greet };
2.

4. Là getter

@Jehna1 có một câu trả lời đầy đủ về điều này, vì vậy hãy cho anh ta tín dụng. Dưới đây là một cách để gọi một dấu ngoặc đơn hàm trên phạm vi toàn cầu, tránh phương pháp

'' + { toString: greet };
3 không dùng nữa. Nó sử dụng
'' + { toString: greet };
4 thay thế.

Chúng ta cần tạo một biến thể của hàm

new constructor[([arguments])]
1 ban đầu cho điều này:

new greet; // parentheses are optional in this construct.
3

Và sau đó:

new greet; // parentheses are optional in this construct.
4

Thay thế

'' + { toString: greet };
6 bằng bất kỳ đối tượng toàn cầu nào của bạn.

Bạn có thể gọi hàm

new constructor[([arguments])]
1 ban đầu mà không để lại dấu vết trên đối tượng toàn cầu như sau:

new greet; // parentheses are optional in this construct.
5

Nhưng người ta có thể lập luận rằng chúng ta có dấu ngoặc đơn ở đây (mặc dù chúng không liên quan đến việc gọi thực tế).

5. Chức năng thẻ

Vì ES6, bạn có thể gọi một hàm chuyển nó một mẫu theo nghĩa đen với cú pháp này:

new greet; // parentheses are optional in this construct.
6

Xem "Tagged Memlate Lingerals".

6. Là người xử lý proxy

Kể từ ES6, bạn có thể xác định proxy:

new greet; // parentheses are optional in this construct.
7

Và sau đó đọc bất kỳ giá trị tài sản nào sẽ được gọi

new constructor[([arguments])]
1:

new greet; // parentheses are optional in this construct.
8

Có nhiều biến thể của điều này. Một ví dụ nữa:

new greet; // parentheses are optional in this construct.
9

7. Như trình kiểm tra ví dụ

Toán tử

'' + { toString: greet };
9 thực thi phương thức
+{ valueOf: greet };
0 trên toán hạng thứ hai, khi được xác định:

new constructor[([arguments])]
0

Bạn có thể gọi một chức năng mà không có dấu ngoặc đơn?

Khi chúng ta gọi một chức năng với dấu ngoặc đơn, chức năng sẽ được thực thi và trả về kết quả cho người được gọi. Trong một trường hợp khác, khi chúng ta gọi một hàm không có dấu ngoặc đơn, một tham chiếu chức năng sẽ được gửi đến gọi có thể gọi thay vì thực hiện chính chức năng.a function reference is sent to the callable rather than executing the function itself.

Bạn có thể gọi một chức năng mà không có dấu ngoặc đơn JavaScript không?

Gọi hàm JavaScript mà không có Parens chuyển định nghĩa của hàm đó làm tài liệu tham khảo.Đây là một trong những nguyên tắc cơ bản để lập trình trong JavaScript được gọi là gọi lại.. It is one of the fundamentals to programming in JavaScript known as callbacks.

Sự khác biệt giữa chức năng gọi với dấu ngoặc đơn và không có trong JavaScript là gì?

Với dấu ngoặc đơn, phương pháp được gọi vì dấu ngoặc đơn, kết quả của việc gọi đó sẽ được lưu trữ trong trước_add.Không có dấu ngoặc đơn, bạn lưu trữ một tham chiếu (hoặc "con trỏ" nếu bạn sẽ) đến hàm trong biến.

Phương pháp nào không yêu cầu sử dụng dấu ngoặc đơn trong JavaScript?

Phương pháp 1: Sử dụng toán tử mới: Toán tử mới được sử dụng để tạo một thể hiện của một đối tượng có hàm tạo hàm.Chức năng xây dựng này có thể được sử dụng để viết chức năng của riêng chúng tôi và sau đó được gọi bởi toán tử mới.Using the new operator: The new operator is used to create an instance of an object which has a constructor function. This constructor function can be used to write our own function and then be invoked by the new operator.