Как можно разыменовать переменные JavaScript при включении внешнего объема

Выполнение следующих команд в таком порядке устранило проблему для меня:

cordova plugin rm cordova-plugin-compat --force --save
cordova plugin add cordova-plugin-compat@1.2 --save
rm -rf ~/.gradle/caches/*
cd platforms/android -> gradlew clean
8
задан meouw 14 January 2009 в 14:10
поделиться

4 ответа

Необходимо использовать этот небольшой прием закрытия - создают и выполняют функцию, которая возвращает функцию обработчика событий.

var links = [ 'one', 'two', 'three' ];

for( var i = 0; i < links.length; i++ ) {
    var a = document.createElement( 'div' );
    a.innerHTML = links[i];
    a.onclick = (function(i) { return function() { alert( i ) } })(i);
    document.body.appendChild( a );
}
20
ответ дан 5 December 2019 в 06:39
поделиться

Я рекомендую Christophs путь с одной функцией, так как это использует меньше ресурсов.

Ниже иначе, который хранит значение на функции (который возможен, потому что функция является объектом), и пользователи argument.callee для получения ссылки на функцию в функции. В этом случае это не имеет большого смысла, но я показываю технику, так как это может быть полезно другими способами:

var links = [ 'one', 'two', 'three' ];

for( var i = 0; i < links.length; i++ ) {
    var a = document.createElement( 'div' );
    a.innerHTML = links[i];
    a.onclick = function() { alert( arguments.callee.i ) }
    a.onclick.i = i;
    document.body.appendChild( a );
}

Техника полезна, когда Ваша функция должна хранить персистентную информацию между вызовами. Замените часть выше этим:

a.id="div"+i;
a.onclick = function() {
    var me = arguments.callee;
    me.count=(me.count|0) + 1;
    alert( me.i );
}

и можно позже получить, сколько раз это назвали:

for( var i = 0; i < links.length; i++ ){
    alert(document.getElementById("div"+i).onclick.count);
}

Это может также привыкнуть к информации о кэше между вызовами.

1
ответ дан 5 December 2019 в 06:39
поделиться

Я остался бы с Вашим собственным решением, но изменил бы его следующим образом:

var links = [ 'one', 'two', 'three' ];

function handler() {
    alert( this.i );
}

for( var i = 0; i < links.length; i++ ) {
    var a = document.createElement( 'div' );
    a.innerHTML = links[i];
    a.i = i; //set a property of the current element with the current value of i
    a.onclick = handler;
    document.body.appendChild( a );
}

Таким образом, только один функциональный объект создается - иначе, функциональный литерал будет оценен на каждом итеративном шаге!

Решение через закрытие еще хуже мудрый производительностью, чем Ваш исходный код.

4
ответ дан 5 December 2019 в 06:39
поделиться

Метод RoBorg является определенно способом пойти, но мне нравится немного отличающийся синтаксис. Оба выполняют то же самое создания закрытия, которое сохраняет 'меня', этот синтаксис просто более ясен мне и требует меньшего количества модификации Вашего существующего кода:

var связывается = ['один', 'два', 'три'];

for( var i = 0; i < links.length; i++ ) (function(i) {
    var a = document.createElement( 'div' );
    a.innerHTML = links[i];
    a.onclick = function() { alert( i ) }
    document.body.appendChild( a );
})(i);
0
ответ дан 5 December 2019 в 06:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: