1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
---
title: Function
slug: Web/JavaScript/Reference/Global_Objects/Function
tags:
- Constructor
- Function
- JavaScript
- TopicStub
- hàm
translation_of: Web/JavaScript/Reference/Global_Objects/Function
---
<div>{{JSRef}}</div>
<p>Hàm<strong> <code>Function</code></strong> tạo mới một đối tượng <code>Function</code>. Gọi hàm tạo trực tiếp có thể tạo các hàm một cách linh hoạt, nhưng gặp phải các vấn đề về bảo mật và hiệu suất tương tự như {{jsxref("eval")}}.</p>
<p>Mỗi một JavaScript function thực sự là một đối tượng <code>Function</code>.</p>
<h2 id="Cú_pháp">Cú pháp</h2>
<pre class="syntaxbox"><code>new Function ([<var>arg1</var>[, <var>arg2</var>[, ...<var>argN</var>]],] <var>functionBody</var>)</code></pre>
<h3 id="Tham_số">Tham số</h3>
<dl>
<dt><code>arg1, arg2, ... arg<em>N</em></code></dt>
<dd>Đây là các tên được sử dụng bởi hàm làm tên các tham số chính thức. Mỗi tên của tham số phải là một chuỗi tương ứng với một mã định danh JavaScript hợp lệ hoặc một danh sách các chuỗi tương tự được phân tách bằng dấu phẩy; ví dụ "<code>x</code>", "<code>theValue</code>" hoặc "<code>a,b</code>".</dd>
<dt><code>functionBody</code></dt>
<dd>Một chuỗi chứa các câu lệnh JavaScript bao gồm định nghĩa hàm.</dd>
</dl>
<h2 id="Mô_tả">Mô tả</h2>
<p>Đối tượng <code>Function</code> được tạo ra thông qua hàm <code>Function</code> được chuyển đổi khi hàm được tạo ra. Điều này kém hiệu quả hơn so với việc khai báo một hàm với <a href="/en-US/docs/Web/JavaScript/Reference/Operators/function">biểu thức hàm</a> hoặc <a href="/en-US/docs/Web/JavaScript/Reference/Statements/function">câu lệnh hàm</a> và gọi nó trong mã của bạn, bởi vì các hàm đó được phân tích cú pháp với phần còn lại của mã. </p>
<p>Tất cả các tham số truyền cho hàm được coi là tên định danh của các tham số trong hàm, thứ mà sẽ được tạo, theo thứ tự chúng được truyền.</p>
<p>Gọi <code>Function</code> như là một hàm (không sử dụng toán tử <code>new</code>) có tác dụng tương tự như gọi nó là một hàm thông thường.</p>
<h2 id="Các_thuộc_tính_và_phương_thức_của_Function">Các thuộc tính và phương thức của <code>Function</code></h2>
<p>Một đối tượng <code>Function</code> toàn cục không có phương thức hoặc thuộc tính của riêng nó. Tuy nhiên, vì bản thân nó là một hàm, nó thừa hưởng một số phương thức và thuộc tính thông qua {{jsxref("Function.prototype")}}.</p>
<h2 id="Function_prototype"><code>Function</code> prototype</h2>
<h3 id="Các_thuộc_tính">Các thuộc tính</h3>
<div>{{page('/en-US/docs/JavaScript/Reference/Global_Objects/Function/prototype', 'Properties')}}</div>
<h3 id="Các_phương_thức">Các phương thức</h3>
<div>{{page('/en-US/docs/JavaScript/Reference/Global_Objects/Function/prototype', 'Methods')}}</div>
<h2 id="Các_thể_hiện_của_Function">Các thể hiện của <code>Function</code></h2>
<p>Các thể hiện của <code>Function</code> kế thừa các phương thức và thuộc tính từ {{jsxref("Function.prototype")}}. Cũng như tất cả các hàm khác, bạn có thể thay đổi prototype của hàm tạo để thực hiện thay đổi cho tất cả các thể hiện của <code>Function</code>.</p>
<h2 id="Các_ví_dụ">Các ví dụ</h2>
<h3 id="Các_tham_số_xác_định_cùng_với_hàm_Function">Các tham số xác định cùng với hàm <code>Function</code></h3>
<p>Đoạn mã sau tạo ra một đối tượng <code>Function</code> có hai tham số.</p>
<pre class="brush: js">// Ví dụ này có thể chạy trực tiếp trên JavaScript Console
// Tạo một hàm gồm hai tham số và trả về tổng của những tham số đó
var adder = new Function('a', 'b', 'return a + b');
// Gọi hàm
adder(2, 6);
// > 8
</pre>
<p>Những tham số "<code>a</code>" và "<code>b</code>" là các tên tham số chính thức được sử dụng trong thân hàm, "<code>return a + b</code>".</p>
<h3 id="Sự_khác_biệt_giữa_hàm_Function_constructor_và_định_nghĩa_hàm">Sự khác biệt giữa hàm Function constructor và định nghĩa hàm</h3>
<p>Các hàm được tạo ra cùng với <code>Function</code> constructor không tạo ra sự khép kín với bối cảnh sáng tạo của chúng; chúng luôn luôn được tạo ra trong phạm vi toàn cục. Khi gọi, chúng sẽ chỉ có thể truy cập đên các biến cục bộ và biến toàn cục của chúng, chứ không phải các biến từ phạm vi mà <code>Function</code> constructor được tạo. Điều này khác với việc sử dụng {{jsxref("eval")}} với mã cho biểu thức hàm.</p>
<pre class="brush: js">var x = 10;
function createFunction1() {
var x = 20;
return new Function('return x;'); // |x| trỏ tới |x| toàn cục
}
function createFunction2() {
var x = 20;
function f() {
return x; // |x| trỏ tới |x| cục bộ ngay bên trên
}
return f;
}
var f1 = createFunction1();
console.log(f1()); // 10
var f2 = createFunction2();
console.log(f2()); // 20
</pre>
<h2 id="Các_thông_số_kỹ_thuật">Các thông số kỹ thuật</h2>
<table class="standard-table">
<tbody>
<tr>
<th scope="col">Thông số kỹ thuật</th>
<th scope="col">Trạng thái</th>
<th scope="col">Chú thích</th>
</tr>
<tr>
<td>{{SpecName('ES1')}}</td>
<td>{{Spec2('ES1')}}</td>
<td>Định nghĩa ban đầu. Được triển khai trong JavaScript 1.0.</td>
</tr>
<tr>
<td>{{SpecName('ES5.1', '#sec-15.3', 'Function')}}</td>
<td>{{Spec2('ES5.1')}}</td>
<td> </td>
</tr>
<tr>
<td>{{SpecName('ES6', '#sec-function-objects', 'Function')}}</td>
<td>{{Spec2('ES6')}}</td>
<td> </td>
</tr>
<tr>
<td>{{SpecName('ESDraft', '#sec-function-objects', 'Function')}}</td>
<td>{{Spec2('ESDraft')}}</td>
<td> </td>
</tr>
</tbody>
</table>
<h2 id="Tính_tương_thích_của_trình_duyệt">Tính tương thích của trình duyệt</h2>
<div>
<p>{{Compat("javascript.builtins.Function")}}</p>
</div>
<h2 id="Tham_khảo">Tham khảo</h2>
<ul>
<li>{{jsxref("Functions", "Functions and function scope")}}</li>
<li>{{jsxref("Function")}}</li>
<li>{{jsxref("Statements/function", "function statement")}}</li>
<li>{{jsxref("Operators/function", "function expression")}}</li>
<li>{{jsxref("Statements/function*", "function* statement")}}</li>
<li>{{jsxref("Operators/function*", "function* expression")}}</li>
<li>{{jsxref("GeneratorFunction")}}</li>
</ul>
|