Pertanyaan Javascript mencegah fungsi anonim?


Saya cukup sering harus mengikat? beberapa fungsi yang membutuhkan argumen. Solusi yang saya gunakan adalah membungkus fungsi untuk mengikat di dalam fungsi anonim.

function foo( arg_0 ) {
   // do stuff with: arg_0
}

function bar() {
   var abc;
   // stuff happens
   abc = 'some value';
   attachEventHandler(elementId, 'click', function(){foo( abc );});
}
bar();

Apakah ada cara yang lebih elegan untuk melakukan ini?


5
2018-02-10 16:11


asal


Jawaban:


Anda bisa membuat pengering, seperti ini:

function curry(func) {
    var functionArgs = Array.prototype.slice.call(arguments, 1);
    return function() { return func.apply(this, functionArgs); };
}

Pemakaian:

attachEventHandler(elementId, 'click', curry(foo, abc) );

Kalau tidak:

Function.prototype.curry = function() {
    var func = this, functionArgs = arguments;
    return function() { return func.apply(this, functionArgs); };
}

Pemakaian:

attachEventHandler(elementId, 'click', foo.curry(abc) );

10
2018-02-10 16:15



Tidak apa-apa. Apa yang Anda miliki pada dasarnya adalah penggunaan a panggilan balik atau "delegasi".

Pengeruk rambut SLAK adalah gula sintaksis yang bagus jika Anda harus sering melakukannya dalam skrip.


1
2018-02-10 16:23



Anda dapat menyembunyikan fungsi kata jika Anda lebih suka 'curry', tetapi metode asli Anda melakukan hal yang sama tanpa overhead.

Anda tidak perlu argumen dalam tanda kurung dalam fungsi anonim- itu masih dalam lingkup ketika Anda mendefinisikannya-

abc = 'some value';
attachEventHandler(elementId, 'click', function( abc ){foo( abc );})
could be:
attachEventHandler(elementId, 'click', function(){foo(abc)});

1
2018-02-10 16:51



Jadi dalam kode Anda, Anda memiliki fungsi foo () yang mengambil peristiwa sebagai argumennya? Jika itu yang ingin Anda lakukan, maka Anda attachEventHandler () dapat ditulis seperti:

attachEventHandler(elementId, 'click', foo);

Apa yang terjadi di sana bukan itu memanggil foo () itu lewat a referensi ke foo ().

Apakah ini lebih dekat dengan apa yang Anda pikirkan?


0
2018-02-10 16:29



Anda bahkan mungkin ingin melihat beberapa libs js

misalnya YUI

apa yang kamu lakukan

YUI().use('node',function(Y){
  Y.one("#elementID").on('click', function(){
    // do your stuff here
  });
});

-2
2018-02-10 16:22