คุณสามารถเขียนฟังก์ชันซ้อนใน JavaScript ได้หรือไม่?


115

ฉันสงสัยว่า JavaScript รองรับการเขียนฟังก์ชันภายในฟังก์ชันอื่นหรือฟังก์ชันซ้อนกัน (ฉันอ่านในบล็อก) เป็นไปได้จริงเหรอ?. อันที่จริงฉันได้ใช้สิ่งเหล่านี้ แต่ไม่แน่ใจในแนวคิดนี้ ฉันไม่ชัดเจนเกี่ยวกับเรื่องนี้ - โปรดช่วยด้วย!

คำตอบ:


196

เป็นไปได้จริงเหรอ.

ใช่.

function a(x) {    // <-- function
  function b(y) { // <-- inner function
    return x + y; // <-- use variables from outer scope
  }
  return b;       // <-- you can even return a function.
}
console.log(a(3)(4));


23
วิธีนี้เรียกว่าการแกง
Yekver

รหัสนี้เทียบเท่ากับรหัสนี้หรือไม่
Anne Ortiz

ฟังก์ชัน a (x) {// <- function return {calc: function (y) {// <- inner function return x * y; // <- return x use variable from outside scope}}; console.log (ก (3) (4));
Anne Ortiz

29

สิ่งต่อไปนี้เป็นสิ่งที่น่ารังเกียจ แต่ทำหน้าที่แสดงให้เห็นว่าคุณสามารถปฏิบัติต่อฟังก์ชันเช่นเดียวกับวัตถุประเภทอื่น ๆ ได้อย่างไร

var foo = function () { alert('default function'); }

function pickAFunction(a_or_b) {
    var funcs = {
        a: function () {
            alert('a');
        },
        b: function () {
            alert('b');
        }
    };
    foo = funcs[a_or_b];
}

foo();
pickAFunction('a');
foo();
pickAFunction('b');
foo();

4
ตัวอย่างที่ดี ฉันจะเพิ่มว่าสิ่งสำคัญคือต้องทราบว่าฟังก์ชันที่กำหนดไว้ในฟังก์ชันอื่นจะมีอยู่ในขอบเขตของฟังก์ชันนั้นเท่านั้น (เว้นแต่คุณจะกำหนดฟังก์ชันส่วนกลางให้ตามตัวอย่างนี้)
Mike Sherov

5
ปฏิบัติต่อฟังก์ชันเหล่านั้นเหมือนวัตถุ
Alex Lomia

17

ฟังก์ชั่นเป็นวัตถุชั้นหนึ่งที่สามารถ:

  • กำหนดไว้ในฟังก์ชันของคุณ
  • สร้างขึ้นเช่นเดียวกับตัวแปรหรือวัตถุอื่น ๆ ณ จุดใด ๆ ในฟังก์ชันของคุณ
  • กลับมาจากฟังก์ชันของคุณ (ซึ่งอาจดูเหมือนชัดเจนหลังจากสองข้อข้างต้น แต่ก็ยัง)

เพื่อสร้างตามตัวอย่างที่ Kenny ให้ไว้:

   function a(x) {
      var w = function b(y) {
        return x + y;
      }
      return w;
   };

   var returnedFunction = a(3);
   alert(returnedFunction(2));

จะแจ้งเตือนคุณด้วย 5.


5
วิธีนี้เรียกว่าการแกง
Yekver

14

ใช่เป็นไปได้ที่จะเขียนและเรียกใช้ฟังก์ชันที่ซ้อนอยู่ในฟังก์ชันอื่น

ลองสิ่งนี้:

function A(){
   B(); //call should be B();
   function B(){

   }
}

11

ไม่เพียง แต่คุณสามารถส่งคืนฟังก์ชันที่คุณส่งผ่านไปยังฟังก์ชันอื่นเป็นตัวแปรได้เท่านั้นคุณยังสามารถใช้เพื่อคำนวณภายใน แต่กำหนดไว้ภายนอก ดูตัวอย่างนี้:

    function calculate(a,b,fn) {
      var c = a * 3 + b + fn(a,b);
      return  c;
    }

    function sum(a,b) {
      return a+b;
    }

    function product(a,b) {
      return a*b;
    }

    document.write(calculate (10,20,sum)); //80
    document.write(calculate (10,20,product)); //250

1
ฉันใช้มันกับ ajax
jscripter
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.