Hướng dẫn can a function return another function in javascript? - một hàm có thể trả về một hàm khác trong javascript không?

Đoạn trích một:

function a() {
  
    alert('A!');

    function b(){
        alert('B!'); 
    }

    return b(); //return nothing here as b not defined a return value
}

var s = a(); //s got nothing assigned as b() and thus a() return nothing.
alert('break');
s(); // s equals nothing so nothing will be executed, JavaScript interpreter will complain

Câu lệnh 'B ()' có nghĩa là thực thi hàm có tên 'B' hiển thị hộp thoại với văn bản 'B!'

Câu lệnh 'Trả về B ();' có nghĩa là thực thi một hàm có tên 'B' và sau đó trả về chức năng 'B' trả về. Nhưng 'B' không trả lại gì, sau đó câu lệnh này 'trả về b ()' không trả về không có gì cả. Nếu b () trả về một số, thì ‘return b () cũng là một số.

Bây giờ 's' được gán giá trị của những gì 'A ()' trả về, trả về 'b ()', không có gì, vì vậy 's' không là gì (trong JavaScript, đó thực sự là một điều, đó là một 'không xác định'. Khi bạn yêu cầu JavaScript giải thích kiểu dữ liệu 'S' là gì, trình thông dịch JavaScript sẽ cho bạn biết 'S' là một không xác định.) Vì 'S' là một người không xác định, khi bạn yêu cầu JavaScript thực thi câu lệnh này 's ()', Bạn đang yêu cầu JavaScript thực thi một hàm có tên là 'S', nhưng 'S' Đây là một 'không xác định', không phải là một hàm, vì vậy JavaScript sẽ phàn nàn, "Này, S không phải là một chức năng, tôi không biết làm thế nào Để làm với S này ", sau đó là một thông báo lỗi" Kiểu chưa bị bắt: S không phải là hàm "sẽ được JavaScript hiển thị (được thử nghiệm trong Firefox và Chrome)


Đoạn mã hai

function a() {
  
    alert('A!');

    function b(){
        alert('B!'); 
    }

    return b; //return pointer to function b here
}

var s = a();  //s get the value of pointer to b
alert('break');
s(); // b() function is executed

Bây giờ, hàm 'A' Trả lại một con trỏ/bí danh cho một hàm có tên là 'B'. Vì vậy, khi thực thi 's = a ()', 's' sẽ nhận được một giá trị trỏ đến b, tức là 's' là một bí danh của 'B' bây giờ, gọi 'S' bằng với gọi 'B'. tức là 's' là một chức năng bây giờ. Thực thi 's ()' có nghĩa là chạy hàm 'B' (giống như thực thi 'B ()'), một hộp thoại hiển thị 'B!' sẽ xuất hiện (tức là chạy 'cảnh báo (' b! '); câu lệnh trong hàm' b ')

Đây là phần 6 của loạt chức năng JavaScript của tôi

  • Phần 1: Chức năng JavaScript → Biểu thức bảo vệ
  • Phần 2: Chức năng JavaScript → Tham số mặc định
  • Phần 3: Chức năng JavaScript → Thực thi chức năng
  • Phần 4: Chức năng JavaScript → Đối tượng hạng nhất
  • Phần 5: Chức năng của JavaScript → Môi trường từ vựng (LexicalENV môi trường)
  • Phần 6: Chức năng JavaScript → Trả về các chức năng từ các chức năng
  • Phần 7: Chức năng JavaScript → Currying

Từ kinh nghiệm của riêng tôi, tôi có thể nói rằng sự trở lại của các chức năng từ các chức năng gây ra những khó khăn lớn nhất cho người mới bắt đầu. Và vấn đề không phải là sự trở lại rất phức tạp, nhưng lúc đầu, rất khó để hiểu tại sao điều này có thể cần thiết. Trong cuộc sống thực, kỹ thuật này thường được sử dụng, cả trong JS và nhiều ngôn ngữ khác. Các chức năng chấp nhận các chức năng trả về các chức năng là phổ biến cho bất kỳ mã JS nào.

Hãy bắt đầu:

Các chức năng là cùng một dữ liệu với các số hoặc chuỗi, vì vậy các hàm có thể được truyền đến các chức năng khác như các đối số, cũng như được trả về từ các chức năng. Chúng ta thậm chí có thể xác định một hàm bên trong một chức năng khác và trả về bên ngoài. Và điều này không đáng ngạc nhiên. Hằng số có thể được tạo ra ở bất cứ đâu.

Bạn thậm chí có thể làm mà không cần tạo ra một hằng số:

Luôn luôn, khi bạn thấy các cuộc gọi như vậy f()()(), hãy biết: các chức năng đã trở lại!functions are back !

Bây giờ, hãy để xem cách khác để mô tả chức năng generateSumFinder:

Để rõ ràng, bạn có thể đặt dấu ngoặc:

Định nghĩa chức năng có sự kết hợp đúng đắn. Tất cả mọi thứ nằm ở bên phải của =>it được coi là cơ thể chức năng. Số lượng đầu tư không bị giới hạn. Hoàn toàn có thể đáp ứng các tùy chọn như vậy:

Hàm tương tự có thể được biểu diễn theo một cách khác nhau, bằng cách loại bỏ từng hàm trong hằng số của chính nó. Phương pháp này hữu ích như một thử nghiệm suy nghĩ, để hiểu nơi một kết thúc và một hàm khác bắt đầu, nhưng bản thân nó sẽ không hoạt động, bởi vì việc đóng cửa bị mất.

Hãy để cố gắng đi qua các cuộc gọi chức năng ở trên để hiểu kết quả thu được như thế nào. Sau mỗi cuộc gọi (ngoại trừ ngày cuối cùng), một hàm mới được trả về, trong đó giá trị từ hàm bên ngoài được thay thế bằng cách đóng.

Như đã thấy ở trên sum1, sum2and ________ 7- một hàm và sum4HAs số, vì tất cả các hàm bên trong được gọi.

Hãy để viết ra tất cả các chức năng:

  • Hàm sumCcepts
    function a() {
      
        alert('A!');
    
        function b(){
            alert('B!'); 
        }
    
        return b; //return pointer to function b here
    }
    
    var s = a();  //s get the value of pointer to b
    alert('break');
    s(); // b() function is executed
    
    0 và trả về một hàm
  • chấp nhận
    function a() {
      
        alert('A!');
    
        function b(){
            alert('B!'); 
        }
    
        return b; //return pointer to function b here
    }
    
    var s = a();  //s get the value of pointer to b
    alert('break');
    s(); // b() function is executed
    
    1 và trả về một chức năng
  • chấp nhận
    function a() {
      
        alert('A!');
    
        function b(){
            alert('B!'); 
        }
    
        return b; //return pointer to function b here
    }
    
    var s = a();  //s get the value of pointer to b
    alert('break');
    s(); // b() function is executed
    
    2 và trả về một chức năng
  • Trả về tổng x + y + z

Hãy cùng cố gắng phát triển ý tưởng về chức năng

function a() {
  
    alert('A!');

    function b(){
        alert('B!'); 
    }

    return b; //return pointer to function b here
}

var s = a();  //s get the value of pointer to b
alert('break');
s(); // b() function is executed
3 từ bài học trước. Chúng ta hãy viết một hàm
function a() {
  
    alert('A!');

    function b(){
        alert('B!'); 
    }

    return b; //return pointer to function b here
}

var s = a();  //s get the value of pointer to b
alert('break');
s(); // b() function is executed
4 đó không áp dụng chức năng ngay lập tức, nhưng tạo ra một hàm mới.

Hàm

function a() {
  
    alert('A!');

    function b(){
        alert('B!'); 
    }

    return b; //return pointer to function b here
}

var s = a();  //s get the value of pointer to b
alert('break');
s(); // b() function is executed
4Takes một hàm như một đối số và trả về một hàm mới. Bên trong chức năng mới, chức năng ban đầu được gọi là hai lần:

Tạo một hàm

function a() {
  
    alert('A!');

    function b(){
        alert('B!'); 
    }

    return b; //return pointer to function b here
}

var s = a();  //s get the value of pointer to b
alert('break');
s(); // b() function is executed
6. Nó sẽ là hàm mà nó trả về
function a() {
  
    alert('A!');

    function b(){
        alert('B!'); 
    }

    return b; //return pointer to function b here
}

var s = a();  //s get the value of pointer to b
alert('break');
s(); // b() function is executed
4 nếu bạn chuyển nó một hàm ____ 18 (nó tính toán căn bậc hai của số).

Hóa ra ________ 16- Đây là một hàm lấy một số và trả về gốc của gốc - f()()()0:

Một ví dụ khác: Hãy để Lừa vượt qua chức năng

function a() {
  
    alert('A!');

    function b(){
        alert('B!'); 
    }

    return b; //return pointer to function b here
}

var s = a();  //s get the value of pointer to b
alert('break');
s(); // b() function is executed
4New cho chức năng một cách nhanh chóng mà không tạo ra nó trước. Hàm truyền bình phương số.

Hàm bây giờ f()()()2Squares Số hai lần: (42) 2.

Hàm

function a() {
  
    alert('A!');

    function b(){
        alert('B!'); 
    }

    return b; //return pointer to function b here
}

var s = a();  //s get the value of pointer to b
alert('break');
s(); // b() function is executed
4HAs một cái tên như một lý do. Thực tế là việc trả về một hàm mỗi lần tạo ra một hàm mới với mỗi cuộc gọi, ngay cả khi các cơ thể của các hàm này giống nhau:

Do đó, về bất kỳ chức năng nào trả về một hàm, bạn có thể nói rằng nó tạo ra một hàm. Nó khá đơn giản để nhớ, nếu bạn nghe hoặc đọc ở đâu đó rằng các chức năng đang được tạo ra, thì ai đó sẽ trả lại chúng.

Ngắn mạch

Công việc của hầu hết các ví dụ được mô tả dựa trên một tài sản thú vị có tên là đóng cửa.

Khi f()()()4 hoàn thành công việc của mình và trả về chức năng mới, phiên bản chức năng f()()()4Disapped, đã bị phá hủy cùng với các đối số được sử dụng bên trong.

Nhưng chức năng được trả về f()()()4is vẫn sử dụng đối số. Trong điều kiện bình thường, nó sẽ biến mất mãi mãi, nhưng ở đây, nó được "nhớ" hoặc "đóng" bên trong hàm trả về. Về mặt kỹ thuật, một hàm bên trong, giống như bất kỳ chức năng nào khác trong JS, được liên kết với môi trường từ vựng của nó, không biến mất, ngay cả khi chức năng rời khỏi môi trường này.

Hàm được trả lại từ f()()()4is được gọi là đóng cửa. Đóng cửa là một chức năng mà nhớ lại một phần của môi trường nơi nó được chỉ định. Hàm tự đóng các định danh (mọi thứ chúng tôi xác định) từ phạm vi từ vựng.closure . A closure is a function that “remembers” the part of the environment where it was specified. The function closes in itself the identifiers (everything that we define) from the lexical scope.

Hãy tưởng tượng rằng chúng tôi đang thiết kế một hệ thống mà bạn cần nhớ mật khẩu của người dùng và sau đó kiểm tra khi người dùng đăng nhập lại. Bạn có thể mô phỏng một hàm f()()()8 mà chấp nhận mật khẩu làm đầu vào và trả về một vị từ, nghĩa là một hàm trả về đúng hoặc sai, để kiểm tra nó. Xem nó trông như thế nào:

Đây là cách mã hàm trông giống như f()()()8:

Một hàm có thể trả về một hàm khác JS không?

Các chức năng là cùng một dữ liệu với các số hoặc chuỗi, vì vậy các hàm có thể được truyền đến các chức năng khác như các đối số, cũng như được trả về từ các chức năng.Chúng ta thậm chí có thể xác định một hàm bên trong một chức năng khác và trả về bên ngoài.functions can be passed to other functions as arguments, as well as returned from functions. We can even define a function inside another function and return it outside.

Chúng ta có thể trả về một hàm bên trong một hàm không?

Bạn có thể lưu trữ chức năng trong một biến.Bạn có thể chuyển chức năng như một tham số cho một hàm khác.Bạn có thể trả về chức năng từ một hàm.You can return the function from a function.

Làm gì === Trả lại trong JavaScript?

=== trong JavaScript là gì?=== (Triple Equals) là một toán tử so sánh bình đẳng nghiêm ngặt trong JavaScript, trả về sai cho các giá trị không thuộc loại tương tự.Toán tử này thực hiện đúc loại cho bình đẳng.Nếu chúng ta so sánh 2 với 2 2, sử dụng ===, thì nó sẽ trả về một giá trị sai.false for the values which are not of a similar type. This operator performs type casting for equality. If we compare 2 with “2” using ===, then it will return a false value.