javascript аргументы анонимная функция - PullRequest
4 голосов
/ 25 августа 2011

Может ли кто-нибудь объяснить, пожалуйста, function(tx) в приведенном ниже фрагменте кода на этой странице: http://www.webkit.org/demos/sticky-notes/. Где и как назначается tx?Я искал здесь для получения информации, но все еще в неведении.

Мне кажется, я понимаю, что метод saveAsNew объекта определяется каканонимная функция, которая сначала создает временную метку и создает локальную ссылку на себя (note = this), а затем вызывает метод транзакция объекта db , предоставляя этому методу параметр, которыйэто еще одна анонимная функция с аргументом tx .Но я не понимаю, откуда tx .

   .
   .
   .
      saveAsNew: function()
         {
             this.timestamp = new Date().getTime();        
             var note = this;
             db.transaction(function (tx)   
                 {
                 tx.executeSql("INSERT INTO WebKitStickyNotes (id, note, timestamp, left, top, zindex) VALUES (?, ?, ?, ?, ?,                   ?)", [note.id, note.text, note.timestamp, note.left, note.top, note.zIndex]);
                 }); 
    },
    .
    .
    .

ПАКЕТ ПОЛНОГО КОДА

Ответы [ 7 ]

1 голос
/ 25 августа 2011

Во-первых, tx - это определение параметра. Вы можете выбрать любое имя, оно также может быть bar. Это не отличается от определения функции как

function foo(bar) {

}

Если вам интересно, "кто" передает этот аргумент, то, вероятно, это db.transaction. Вы передаете функцию как обратный вызов [Википедия] . Где-нибудь db.transaction позвонит:

callback(transaction);

Может быть, этот пример помогает понять:

function hello(callback) {
    // do some very important world changing computations... then:
    callback('Hello ');
}

hello(function(foobar) {
    alert(foobar + 'Tim!');
});
// alerts 'Hello Tim!'

Здесь функция hello передает один параметр функции обратного вызова.

0 голосов
/ 25 августа 2011

Для вызова функции db.transaction() сам по себе требуется один параметр. Этот параметр сам по себе является функцией, которую db.transaction() будет вызывать, и когда он вызывает эту функцию, он передает ей один параметр. Имя tx может быть любым, это просто имя для первого параметра этой функции.

Ваш код мог быть написан с помощью той функции, которую вы передаете db.transaction() как анонимную функцию, как вы делали здесь:

db.transaction(function (tx)   
{
    tx.executeSql("INSERT INTO WebKitStickyNotes (id, note, timestamp, left, top, zindex) VALUES (?, ?, ?, ?, ?,                   ?)", [note.id, note.text, note.timestamp, note.left, note.top, note.zIndex]);
}); 

или это можно было бы написать так, где немного более очевидно, что происходит, но не так компактно:

function writeSql(tx) {
    tx.executeSql("INSERT INTO WebKitStickyNotes (id, note, timestamp, left, top, zindex) VALUES (?, ?, ?, ?, ?,                   ?)", [note.id, note.text, note.timestamp, note.left, note.top, note.zIndex]);
}

db.transaction(writeSql);
0 голосов
/ 25 августа 2011

Ваш код эквивалентен этому:

 saveAsNew: function()
     {
         this.timestamp = new Date().getTime();        
         var note = this;
         function booga(tx)
         {
             tx.executeSql("INSERT INTO WebKitStickyNotes (id, note, timestamp, left, top, zindex) VALUES (?, ?, ?, ?, ?,                   ?)", [note.id, note.text, note.timestamp, note.left, note.top, note.zIndex]);
         }
         db.transaction(booga);
},

Откуда взято "tx" в "booga (tx)"?Ответ: Тот, кто вызывает Booga, передает параметр, и tx - это имя, которое мы дали этому параметру.

0 голосов
/ 25 августа 2011

Вы могли бы использовать любую переменную, если только в определении вашего анонимного метода вы используете ту же самую переменную. Метод транзакции передаст значение в качестве первого параметра при вызове вашего анонимного метода, и он будет присвоен tx.

0 голосов
/ 25 августа 2011

Функция db.transaction () должна принимать аргумент, который является функцией, которая принимает один параметр (функция (tx) в вашем примере).

Вероятно, это задокументировано как db.transaction (callback).

Параметр tx отправляется в функцию обратного вызова (анонимная функция (tx) в вашем случае) функцией db.transaction ().

0 голосов
/ 25 августа 2011

Функция saveAsNew возвращает функцию, которая принимает tx в качестве аргумента:

var new = saveAsNew();
new(tx);

Откуда берется tx, из этого фрагмента невозможно сказать.

0 голосов
/ 25 августа 2011

Если бы я знал, что такое transaction(), я мог бы помочь вам больше.

Но я верю, что это то, что возвращает функция.

Как клик имеет event, который возвращается

Итак, где-то в коде transaction в функцию передается переменная, которую вы затем можете назвать и использовать в своем коде.


С более раннего кода:

db = openDatabase("NoteTest", "1.0", "HTML5 Database API example", 200000);

Вы должны посмотреть, что делает openDatabase с функцией transaction.

Вы можете прочитать о openDatabase() здесь

...