JavaScript'te yuvalanmış işlevler yazabilir misiniz?


115

JavaScript'in başka bir işlev içinde bir işlev veya yuvalanmış işlevler yazmayı destekleyip desteklemediğini merak ediyorum (bir blogda okudum). Bu gerçekten mümkün mü? Aslında bunları kullandım ama bu kavramdan emin değilim. Bu konuda gerçekten emin değilim - lütfen yardım edin!

Yanıtlar:


196

Bu gerçekten mümkün mü?

Evet.

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
Bu yönteme körleme denir.
Yekver

bu kod buna eşdeğer mi?
Anne Ortiz

işlev a (x) {// <- işlev dönüş {hesap: işlev (y) {// <- iç işlev dönüş x * y; // <- dış kapsamdan x değişkenleri kullanın}}; console.log (bir (3) (4));
Anne Ortiz

29

Aşağıdakiler kötüdür, ancak işlevleri diğer herhangi bir nesne türü gibi nasıl ele alabileceğinizi göstermeye hizmet eder.

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
Harika bir örnek. Eklemek isterim ki, diğer işlevler içinde tanımlanan işlevlerin yalnızca bu işlevler kapsamında var olduğuna dikkat edin (tabii ki, bu örneğe göre ona bir genel işlev atamadığınız sürece).
Mike Sherov

5
Bu işlevlere oldukları nesneler gibi davranın
Alex Lomia

17

Fonksiyonlar, aşağıdaki özelliklere sahip birinci sınıf nesnelerdir:

  • İşlevinize göre tanımlanır
  • İşlevinizin herhangi bir noktasında diğer herhangi bir değişken veya nesne gibi oluşturulur
  • İşlevinizden geri döndü (yukarıdaki ikisinden sonra açık görünebilir, ancak yine de)

Kenny tarafından verilen örneği geliştirmek için:

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

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

5 ile sizi uyarır.


5
Bu yönteme körleme denir.
Yekver

14

Evet, başka bir işlevin içine yerleştirilmiş bir işlevi yazmak ve çağırmak mümkündür.

Bunu dene:

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

   }
}

11

Başka bir işleve aktardığınız bir işlevi yalnızca değişken olarak döndürmekle kalmaz, aynı zamanda onu içeride hesaplamak ve dışarıda tanımlamak için de kullanabilirsiniz. Bu örneğe bakın:

    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
bunu ajax ile kullanıyorum
jscripter
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.