Mục đích của chức năng tự thực thi trong javascript là gì?


427

Trong javascript, khi nào bạn muốn sử dụng cái này:

(function(){
    //Bunch of code...
})();

về điều này:

//Bunch of code...

3
Cũng có một cái nhìn vào một lời giải thích ( kỹ thuật ) và ở đây . Đối với cú pháp, hãy xem tại sao dấu ngoặc đơn là cần thiếtchúng nên đi đâu .
Bergi


Tại sao nó có hai dấu ngoặc đơn cuối cùng, ngay trước dấu chấm phẩy?
johnny

3
@johnny phần trước hai dấu ngoặc đơn cuối cùng khai báo hàm (ẩn danh). Hai dấu ngoặc đơn gọi hàm.
Ej.

7
"Biểu hiện chức năng được gọi ngay lập tức" hoặc IIFE là một tên tốt hơn cho việc này.
Flimm

Câu trả lời:


404

Đó là tất cả về phạm vi biến. Các biến được khai báo trong hàm tự thực thi, theo mặc định, chỉ có sẵn để mã trong hàm tự thực thi. Điều này cho phép mã được viết mà không cần quan tâm đến cách các biến được đặt tên trong các khối mã JavaScript khác.

Ví dụ, như được đề cập trong một bình luận của Alexander :

(function() {
  var foo = 3;
  console.log(foo);
})();

console.log(foo);

Điều này sẽ đăng nhập đầu tiên 3và sau đó ném một lỗi tiếp theo console.logfookhông được xác định.


7
Và cũng vì lợi ích của nhiều người ngoài kia, bao gồm cả một nhóm Kỹ sư Netflix: NÓ CHỈ LÀ MỘT CHỨC NĂNG. Nó không phải là đại diện của chính nó. Đôi khi, những người sử dụng tự động được sử dụng cùng với các tình huống liên quan đến đóng cửa để làm những thứ gọn gàng, nhưng nếu bạn không thấy thứ gì đó giữ trong một tham chiếu sẽ được thu gom rác và sử dụng ngôn ngữ không đóng, thì nó không có gì để freaking làm với CLOSOUND.
Erik Reppen

2
Vì vậy, điều này có nghĩa là, chủ yếu được sử dụng với đóng cửa?
Pir Abdul

@AlexanderBird, không hoàn toàn đúng ... nếu bạn không có var, như thế này : ...function(){ foo=3;}? Nó sẽ đặt biến toàn cục, phải không?
T.Todua

2
@AlexanderBird nhưng điều đó đã xảy ra trong các biến cục bộ bên trong các hàm: function(){ var foo = 3; alert(foo); }; alert(foo);Vì vậy, tôi vẫn không hiểu được
João Pimentel Ferreira

À, tôi hiểu rồi, bạn đạt được cả 3 tính năng này cùng một lúc: 1) bạn thực thi chức năng bằng cách chỉ khai báo nó; 2) Vì bất kỳ chức năng nào, phạm vi biến chỉ là cục bộ; và 3) Chức năng có thể ẩn danh, không gây ô nhiễm phạm vi chính
João Pimentel Ferreira

94

Đơn giản. Nhìn rất bình thường, nó gần như an ủi:

var userName = "Sean";

console.log(name());

function name() {
  return userName;
}

Tuy nhiên, điều gì sẽ xảy ra nếu tôi bao gồm một thư viện javascript thực sự tiện dụng vào trang của mình để dịch các ký tự nâng cao thành các biểu diễn cấp cơ sở của chúng?

Đợi ... cái gì?

Ý tôi là, nếu ai đó gõ một ký tự có một số điểm nhấn vào nó, nhưng tôi chỉ muốn các ký tự 'tiếng Anh' AZ trong chương trình của tôi? Chà ... các ký tự 'é' của Tây Ban Nha và tiếng Pháp có thể được dịch thành các ký tự cơ bản của 'n' và 'e'.

Vì vậy, một người tốt bụng đã viết một trình chuyển đổi nhân vật toàn diện ra khỏi đó mà tôi có thể đưa vào trang web của mình ... Tôi bao gồm nó.

Một vấn đề: nó có một chức năng trong đó gọi là 'name' giống như chức năng của tôi.

Đây là những gì được gọi là va chạm. Chúng ta có hai hàm được khai báo trong cùng một phạm vi có cùng tên. Chúng tôi muốn tránh điều này.

Vì vậy, chúng ta cần phải phạm vi mã của chúng tôi bằng cách nào đó.

Cách duy nhất để phạm vi mã trong javascript là bọc nó trong một hàm:

function main() {
  // We are now in our own sound-proofed room and the 
  // character-converter libarary's name() function can exist at the 
  // same time as ours. 

  var userName = "Sean";

  console.log(name());

  function name() {
    return userName;
  }
}

Điều đó có thể giải quyết vấn đề của chúng tôi. Tất cả mọi thứ bây giờ được bao quanh và chỉ có thể được truy cập từ trong niềng răng mở và đóng của chúng tôi.

Chúng tôi có một chức năng trong một chức năng ... thật kỳ lạ khi xem xét, nhưng hoàn toàn hợp pháp.

Chỉ có một vấn đề. Mã của chúng tôi không hoạt động. Biến userName của chúng tôi không bao giờ được lặp lại trong bảng điều khiển!

Chúng tôi có thể giải quyết vấn đề này bằng cách thêm một cuộc gọi vào chức năng của chúng tôi sau khối mã hiện tại của chúng tôi ...

function main() {
  // We are now in our own sound-proofed room and the 
  // character-converter libarary's name() function can exist at the 
  // same time as ours. 

  var userName = "Sean";

  console.log(name());

  function name() {
    return userName;
  }
}

main();

Hoặc trước!

main();

function main() {
  // We are now in our own sound-proofed room and the 
  // character-converter libarary's name() function can exist at the 
  // same time as ours. 

  var userName = "Sean";

  console.log(name());

  function name() {
    return userName;
  }
}

Một mối quan tâm thứ yếu: cơ hội mà tên 'chính' chưa được sử dụng là gì? ... rất, rất mỏng

Chúng tôi cần phạm vi THÊM. Và một số cách để tự động thực hiện hàm main () của chúng tôi.

Bây giờ chúng ta đến với các chức năng tự động thực hiện (hoặc tự thực thi, tự chạy, bất cứ điều gì).

((){})();

Cú pháp lúng túng như tội lỗi. Tuy nhiên, nó hoạt động.

Khi bạn bọc một định nghĩa hàm trong ngoặc đơn và bao gồm một danh sách tham số (một tập hợp hoặc dấu ngoặc đơn khác!), Nó hoạt động như một lệnh gọi hàm .

Vì vậy, hãy xem lại mã của chúng tôi, với một số cú pháp tự thực hiện:

(function main() {
  var userName = "Sean";

    console.log(name());

    function name() {
      return userName;
    }
  }
)();

Vì vậy, trong hầu hết các hướng dẫn bạn đọc, giờ đây bạn sẽ bị bắn phá với thuật ngữ 'tự thực hiện ẩn danh' hoặc một cái gì đó tương tự.

Sau nhiều năm phát triển nghề nghiệp, tôi mạnh mẽ kêu gọi bạn để đặt tên mỗi chức năng bạn viết cho mục đích gỡ lỗi.

Khi có sự cố xảy ra (và nó sẽ xảy ra), bạn sẽ kiểm tra backtrace trong trình duyệt của mình. Việc thu hẹp các vấn đề về mã của bạn luôn dễ dàng hơn khi các mục trong theo dõi ngăn xếp có tên!

Rất dài và tôi hy vọng nó sẽ giúp!


2
Cảm ơn bạn :) Tôi đã tìm kiếm trên internet suốt chặng đường cố gắng tìm hiểu những lợi thế của IIFE liên quan đến các chức năng thông thường về quyền riêng tư và câu trả lời của bạn đơn giản là tốt nhất. Mọi người đều nói rằng một trong những lợi thế tốt nhất là các biến và hàm trong IIFE là 'cuối cùng' riêng tư khi một hàm bình thường chỉ cung cấp cho bạn chính xác điều tương tự. Cuối cùng tôi nghĩ rằng tôi đã nhận được nó thông qua quá trình giải thích của bạn. IIFE chỉ là một chức năng nhưng bây giờ tôi đã hiểu tại sao nên sử dụng nó. Cảm ơn bạn một lần nữa!
viery365

Cảm ơn đã dành thời gian để giải thích điều này rất tốt.
MSC

Câu trả lời tốt đẹp. Tuy nhiên, tôi có một câu hỏi về điểm cuối cùng của bạn - Khi bạn đề nghị tất cả các hàm được đặt tên, bạn có nói rằng có một cách để làm điều đó với các hàm tự thực hiện hoặc đề nghị mọi người đặt tên cho hàm đó sau đó gọi nó? EDIT Ồ, tôi hiểu rồi. Cái này đã được đặt tên. Tât nhiên. Có thể muốn chỉ ra rằng bạn đang biện minh cho việc bạn sử dụng chức năng tự thực hiện có tên.
FireSBurnsmuP

Vâng, bạn của tôi, đây là câu trả lời tôi đang tìm kiếm:)
João Pimentel Ferreira

Đây là câu trả lời tôi đang tìm kiếm, không phải là câu trả lời được chấp nhận. Tôi có đúng không khi nói rằng đó không phải là về xung đột tên biến , mà là về xung đột tên hàm ? Các biến trong các hàm không phải iife bình thường nằm trong phạm vi cục bộ và không va chạm với các biến toàn cục, phải không?
Kumar Manish

32

Tự gọi (còn được gọi là tự động gọi) là khi một hàm thực thi ngay lập tức theo định nghĩa của nó. Đây là một mẫu cốt lõi và đóng vai trò là nền tảng cho nhiều mẫu phát triển JavaScript khác.

Tôi là một fan hâm mộ lớn :) của nó bởi vì:

  • Nó giữ mã ở mức tối thiểu
  • Nó thực thi tách hành vi khỏi trình bày
  • Nó cung cấp một bao đóng ngăn chặn xung đột đặt tên

Rất nhiều - (Tại sao bạn nên nói nó tốt?)

  • Đó là về việc xác định và thực hiện một chức năng cùng một lúc.
  • Bạn có thể có chức năng tự thực thi đó trả về một giá trị và truyền hàm dưới dạng tham số cho hàm khác.
  • Nó tốt cho việc đóng gói.
  • Nó cũng tốt cho phạm vi khối.
  • Vâng, bạn có thể đặt tất cả các tệp .js của mình trong một chức năng tự thực thi và có thể ngăn ngừa ô nhiễm không gian tên toàn cầu. ;)

Thêm ở đây .


43
Điểm 1. Làm thế nào? Điểm 2. Đó là từ một thực tiễn tốt nhất hoàn toàn khác. Điểm 3. Chức năng nào không? 4,5,6,7. Sự liên quan? 8. Chà, tôi đoán là không tệ lắm.
Erik Reppen

2
Bảy năm trễ, nhưng đối với điểm 1. nó hoàn toàn không làm giảm mã, trên thực tế, nó thêm tối thiểu hai dòng mã trong việc tạo hàm.
YungGun

1
điểm duy nhất ở đây là "Nó cung cấp một bao đóng ngăn chặn xung đột đặt tên", mọi điểm khác là viết lại điều này hoặc sai. có lẽ bạn có thể đơn giản hóa câu trả lời của bạn?
pcarvalho

19

Không gian tên. Phạm vi của JavaScript là cấp độ chức năng.


7
downvote vẫn đang đến vì tôi đã sử dụng không gian tên của phạm vi ; đây là một vấn đề định nghĩa - xem ví dụ Wikipedia : Một không gian tên trong khoa học máy tính (đôi khi còn được gọi là phạm vi tên), là nơi chứa trừu tượng hoặc môi trường tạo ra để tổ chức một nhóm hợp lý của định danh duy nhất hoặc biểu tượng (ví dụ, tên). Một định danh không gian tên có thể cung cấp ngữ cảnh (Phạm vi trong khoa học máy tính) cho một tên và các thuật ngữ đôi khi được sử dụng thay thế cho nhau.
Christoph

5
Phạm vi cấp độ chức năng của Javascript cung cấp không gian mà các tên biến sống trong đó, một không gian tên ; rằng nó là một ẩn danh không liên quan đến một định danh không gian tên là không liên quan ...
Christoph

12

Tôi không thể tin rằng không có câu trả lời nào đề cập đến toàn cầu.

Cấu (function(){})()trúc không bảo vệ chống lại toàn cầu ngụ ý, mà đối với tôi là mối quan tâm lớn hơn, xem http://yuiblog.com/blog/2006/06/01/global-domination/

Về cơ bản, khối chức năng đảm bảo tất cả các "vars toàn cầu" phụ thuộc mà bạn đã xác định được giới hạn trong chương trình của bạn, nó không bảo vệ bạn khỏi việc xác định các phần tử ẩn. Mã não hoặc tương tự có thể cung cấp các khuyến nghị về cách bảo vệ chống lại hành vi này.

var App = {}Cú pháp ngắn gọn hơn cung cấp một mức độ bảo vệ tương tự và có thể được gói trong khối chức năng khi trên các trang 'công khai'. (xem Ember.js hoặc SproutCore để biết các ví dụ trong thế giới thực của các thư viện sử dụng cấu trúc này)

Theo như privatecác thuộc tính, chúng là loại được đánh giá cao trừ khi bạn đang tạo một khung công khai hoặc thư viện, nhưng nếu bạn cần thực hiện chúng, Douglas Crockford có một số ý tưởng hay.


8
Chế độ nghiêm ngặt bảo vệ chống lại toàn cầu ngụ ý. Điều đó kết hợp với một kẻ xâm lược tự động sẽ có bạn bảo hiểm. Tôi không bao giờ hiểu được hoopmus trên tài sản tư nhân. Khai báo các lọ bên trong của hàm tạo func. Làm xong. Nếu ý nghĩ quên sử dụng từ khóa 'mới' khiến bạn thức đêm, hãy viết một chức năng của nhà máy. Thực hiện lại.
Erik Reppen

8

Tôi đã đọc tất cả các câu trả lời, một điều rất quan trọng đang thiếu ở đây , tôi sẽ HÔN. Có hai lý do chính, tại sao tôi cần Tự thực hiện các Hàm ẩn danh hoặc nói tốt hơn là " Biểu hiện chức năng được gọi ngay lập tức (IIFE) ":

  1. Quản lý không gian tên tốt hơn (Tránh ô nhiễm không gian tên -> Mô-đun JS)
  2. Đóng cửa (Mô phỏng các thành viên lớp tư nhân, như được biết từ OOP)

Điều đầu tiên đã được giải thích rất tốt. Đối với cái thứ hai, xin vui lòng nghiên cứu ví dụ sau:

var MyClosureObject = (function (){
  var MyName = 'Michael Jackson RIP';
  return {
    getMyName: function () { return MyName;},
    setMyName: function (name) { MyName = name}
  }
}());

Chú ý 1: Chúng tôi không chỉ định một chức năng MyClosureObject, hơn nữa kết quả của việc gọi chức năng đó . Coi chừng() trong dòng cuối cùng.

Chú ý 2: Ngoài ra, bạn cần biết gì về các hàm trong Javascript là các hàm bên trong có quyền truy cập vào các tham số và biến của các hàm, chúng được định nghĩa bên trong.

Hãy để chúng tôi thử một số thí nghiệm:

Tôi có thể MyNamesử dụng getMyNamevà nó hoạt động:

 console.log(MyClosureObject.getMyName()); 
 // Michael Jackson RIP

Cách tiếp cận khéo léo sau đây sẽ không hoạt động:

console.log(MyClosureObject.MyName); 
// undefined

Nhưng tôi có thể đặt tên khác và nhận được kết quả mong đợi:

MyClosureObject.setMyName('George Michael RIP');
console.log(MyClosureObject.getMyName()); 
// George Michael RIP

Chỉnh sửa: Trong ví dụ trên MyClosureObjectđược thiết kế để được sử dụng mà không có newtiền tố, do đó theo quy ước, nó không nên được viết hoa.


7

Có một tham số và "Bunch of code" trả về một hàm không?

var a = function(x) { return function() { document.write(x); } }(something);

Khép kín. Giá trị somethingđược sử dụng bởi hàm được gán cho a. somethingcó thể có một số giá trị khác nhau (cho vòng lặp) và mỗi khi có một hàm mới.


+1; Mặc dù vậy, tôi thích một hàm rõ ràng var x = something;hơn xlà tham số: imo nó dễ đọc hơn theo cách này ...
Christoph

@Christoph: Nếu giá trị của "cái gì đó" thay đổi sau khi hàm được tạo, thì nó sẽ sử dụng giá trị mới chứ không phải giá trị tại thời điểm tạo.
stesch

@stesch: bạn lấy nó từ đâu vậy? Theo tôi biết, đó không phải là trường hợp; cách duy nhất để có được các tham chiếu thực sự trong JS là sử dụng đối tượng đối số, nhưng ngay cả điều đó không hoạt động trong tất cả các trình duyệt
Christoph

@Christoph: "JavaScript: Bộ phận tốt", Douglas Crockford (O'Reilly)
stesch

@stesch: nó không hoạt động theo cách bạn mô tả: giá trị mới sẽ được sử dụng nếu bạn bỏ biến xvà phụ thuộc trực tiếp vào phạm vi từ vựng, tức là document.write(something)...
Christoph

6

Phạm vi cách ly, có thể. Vì vậy, các biến bên trong khai báo hàm không gây ô nhiễm không gian tên bên ngoài.

Tất nhiên, trên một nửa các triển khai JS ngoài kia, dù sao thì chúng cũng sẽ như vậy.


4
Những triển khai đó sẽ là gì?
Matthew Crumley

1
Bất kỳ triển khai nào không được viết trong chế độ nghiêm ngặt và chứa và khai báo var ẩn khiến nó là toàn cục.
Erik Reppen

5

Đây là một ví dụ chắc chắn về cách một chức năng ẩn danh tự gọi có thể hữu ích.

for( var i = 0; i < 10; i++ ) {
  setTimeout(function(){
    console.log(i)
  })
}

Đầu ra: 10, 10, 10, 10, 10...

for( var i = 0; i < 10; i++ ) {
  (function(num){
    setTimeout(function(){
      console.log(num)
    })
  })(i)
}

Đầu ra: 0, 1, 2, 3, 4...


bạn có thể giải thích thêm một chút về những gì đang xảy ra cho bộ mã đầu tiên
radio_head

Với letthay cho vartrường hợp đầu tiên sẽ ổn.
Vitaly Zdanevich

3

Một điểm khác biệt là các biến mà bạn khai báo trong hàm là cục bộ, vì vậy chúng sẽ biến mất khi bạn thoát khỏi hàm và không xung đột với các biến khác trong mã khác.


1

Vì các hàm trong Javascript là đối tượng hạng nhất, bằng cách định nghĩa nó theo cách đó, nó xác định một cách hiệu quả một "lớp" giống như C ++ hoặc C #.

Hàm đó có thể định nghĩa các biến cục bộ và có các hàm bên trong nó. Các hàm bên trong (phương thức thể hiện hiệu quả) sẽ có quyền truy cập vào các biến cục bộ (biến thể hiện hiệu quả), nhưng chúng sẽ được tách biệt khỏi phần còn lại của tập lệnh.


1

Chức năng tự gọi trong javascript:

Một biểu thức tự gọi được gọi tự động (bắt đầu) mà không được gọi. Một biểu thức tự gọi được gọi ngay sau khi nó được tạo. Điều này về cơ bản được sử dụng để tránh xung đột đặt tên cũng như để đạt được đóng gói. Các biến hoặc đối tượng khai báo không thể truy cập bên ngoài hàm này. Để tránh các vấn đề tối thiểu hóa (filename.min) luôn sử dụng chức năng tự thực hiện.


1

Chức năng tự thực thi được sử dụng để quản lý phạm vi của Biến.

Phạm vi của một biến là khu vực của chương trình mà nó được xác định.

Một biến toàn cầu có phạm vi toàn cầu; nó được định nghĩa ở mọi nơi trong mã JavaScript của bạn và có thể được truy cập từ bất kỳ đâu trong tập lệnh, ngay cả trong các chức năng của bạn. Mặt khác, các biến được khai báo trong một hàm chỉ được xác định trong phần thân của hàm. Chúng là các biến cục bộ, có phạm vi cục bộ và chỉ có thể được truy cập trong hàm đó. Các tham số hàm cũng được tính là các biến cục bộ và chỉ được xác định trong phần thân của hàm.

Như được hiển thị bên dưới, bạn có thể truy cập biến toàn cục bên trong hàm của mình và cũng lưu ý rằng trong phần thân của hàm, một biến cục bộ được ưu tiên hơn một biến toàn cục có cùng tên.

var globalvar = "globalvar"; // this var can be accessed anywhere within the script

function scope() {
    alert(globalvar);
    localvar = "localvar" //can only be accessed within the function scope
}

scope(); 

Vì vậy, về cơ bản, một hàm tự thực thi cho phép mã được viết mà không cần quan tâm đến cách các biến được đặt tên trong các khối mã javascript khác.


1
(function(){
    var foo = {
        name: 'bob'
    };
    console.log(foo.name); // bob
})();
console.log(foo.name); // Reference error

Trên thực tế, hàm trên sẽ được coi là biểu thức hàm mà không có tên.

Mục đích chính của việc gói một hàm với dấu ngoặc đơn đóng và mở là để tránh gây ô nhiễm không gian toàn cầu.

Các biến và hàm bên trong biểu thức hàm trở thành riêng tư (nghĩa là) chúng sẽ không có sẵn bên ngoài hàm.


1

Câu trả lời ngắn gọn là: để ngăn ngừa ô nhiễm phạm vi Toàn cầu (hoặc cao hơn).

IIFE (Biểu thức chức năng được gọi ngay lập tức) là cách thực hành tốt nhất để viết tập lệnh dưới dạng trình cắm, tiện ích bổ sung, tập lệnh người dùng hoặc bất kỳ tập lệnh nào được mong đợi sẽ hoạt động với tập lệnh của người khác . Điều này đảm bảo rằng bất kỳ biến nào bạn xác định không cung cấp hiệu ứng không mong muốn trên các tập lệnh khác.

Đây là cách khác để viết biểu thức IIFE. Cá nhân tôi thích phương pháp sau:

void function() {
  console.log('boo!');
  // expected output: "boo!"
}();

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/void

Từ ví dụ trên, rõ ràng IIFE cũng có thể ảnh hưởng đến hiệu quả và hiệu suất, bởi vì chức năng dự kiến ​​chỉ được chạy một lần sẽ được thực hiện một lần và sau đó được bỏ vào khoảng trống . Điều này có nghĩa là khai báo hàm hoặc phương thức không còn trong bộ nhớ.


Thật tuyệt, tôi đã không thấy rằng việc sử dụng voidtrước đây. Tôi thích nó.
Ej.

1

Trước tiên, bạn phải truy cập MDN IIFE , Bây giờ một số điểm về điều này

  • đây là biểu hiện chức năng được gọi ngay lập tức . Vì vậy, khi tệp javascript của bạn được gọi từ HTML, chức năng này được gọi ngay lập tức.
  • Điều này ngăn chặn việc truy cập các biến trong thành ngữ IIFE cũng như gây ô nhiễm phạm vi toàn cầu.

0

Có vẻ như câu hỏi này đã được trả lời sẵn sàng, nhưng dù sao tôi cũng sẽ đăng đầu vào của mình.

Tôi biết khi tôi thích sử dụng các chức năng tự thực hiện.

var myObject = {
    childObject: new function(){
        // bunch of code
    },
    objVar1: <value>,
    objVar2: <value>
}

Hàm cho phép tôi sử dụng một số mã bổ sung để xác định các thuộc tính và thuộc tính của childObjects cho mã sạch hơn, chẳng hạn như đặt các biến thường được sử dụng hoặc thực hiện các phương trình toán học; Oh! hoặc kiểm tra lỗi. trái ngược với việc bị giới hạn ở cú pháp khởi tạo đối tượng lồng nhau của ...

object: {
    childObject: {
        childObject: {<value>, <value>, <value>}
    }, 
    objVar1: <value>,
    objVar2: <value>
}

Viết mã nói chung có rất nhiều cách tối nghĩa để làm nhiều việc giống nhau, khiến bạn tự hỏi, "Tại sao phải bận tâm?" Nhưng các tình huống mới tiếp tục xuất hiện khi bạn không còn chỉ dựa vào hiệu trưởng cơ bản / cốt lõi.


0

Đưa ra câu hỏi đơn giản của bạn: "Trong javascript, khi nào bạn muốn sử dụng cái này: ..."

Tôi thích câu trả lời của @ken_browning và @ sean_keeping, nhưng đây là một trường hợp sử dụng khác mà tôi không thấy được đề cập:

let red_tree = new Node(10);

(async function () {
    for (let i = 0; i < 1000; i++) {
        await red_tree.insert(i);
    }
})();

console.log('----->red_tree.printInOrder():', red_tree.printInOrder());

trong đó Node.insert là một số hành động không đồng bộ.

Tôi không thể gọi chờ mà không có từ khóa async khi khai báo chức năng của mình và tôi không cần một chức năng được đặt tên để sử dụng sau này, nhưng cần chờ cuộc gọi chèn đó hoặc tôi cần một số tính năng phong phú khác (ai biết?) .


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.