#javascript #jquery
#javascript #jquery
Вопрос:
В чем разница между:
<script type="text/javascript">
$().ready(function() {
InitialDictionary = new Array();
LoadCurrentValues(InitialDictionary);
$("a[id*=SomeLink]").click(function() {
if (!CompareDictionaries(InitialDictionary))
{
alert('Hello')
}
}
)
})
</script>
и
<script type="text/javascript">
$().ready(function () {
InitialDictionary = new Array();
LoadCurrentValues(InitialDictionary);
$("a[id*=SomeLink]").click(CheckValuesChanged(InitialDictionary));
})
function CheckValuesChanged(InitialDictionary) {
if (!CompareDictionaries(InitialDictionary))
{
alert('Hello')
}
}
</script>
Не вдаваясь в подробности того, чего я пытаюсь достичь здесь, есть ли какая-либо причина, по которой анонимный метод работает нормально, а вызов функции — нет? Разве они не должны давать одинаковые результаты?
Ответ №1:
Чтобы вызвать функцию, вы должны сделать это:
$("a[id*=LogoLink]").click(function(){CheckValuesChanged(InitialDictionary)});
Или:
$("a[id*=LogoLink]").click("CheckValuesChanged(InitialDictionary)"); //might work
Комментарии:
1. Нет, это не сработает. При вызове
setTimeout
это сработало бы (за исключением переменной), но это вызывает сильное неодобрение.2. @SLaks, следовательно, возможно , лучше выбрать вариант 1
3. И первое решение по-прежнему использует анонимную функцию. Операционная система, похоже, хочет сделать это без анонимной функции.
Ответ №2:
Они оба работают, но вы не можете привязать функцию к событию, подобному этому
$("a[id*=LogoLink]").click(CheckValuesChanged(InitialDictionary));
потому что функция a должна быть привязана к событию click. Когда вы передаете аргумент функции, он возвращает undefined
, который не является функцией. Вы можете исправить это, изменив свой второй пример кода следующим образом:
$().ready(function () {
InitialDictionary = new Array();
LoadCurrentValues(InitialDictionary);
$("a[id*=LogoLink]").click(CheckValuesChanged);
function CheckValuesChanged() {
if (!CompareDictionaries(InitialDictionary)) {
alert('Hello')
}
}
});
Комментарии:
1.
InitialDictionary
не входит в областьCheckValuesChanged
2. не всегда лучше использовать подобные переменные, чем какой смысл в функции, если переменная глобальная?
3. Объявите InitialDictionary вне какой-либо функции, прямо в начале вашего тела javascript. Документ. Готовая функция присвоит ей значение, и CheckValuesChanged сможет получить к ней доступ позже.
4. Точка зрения @Dmitri Neal все равно останется в силе, потому что она будет опираться на глобальную переменную evil.
Ответ №3:
Второй пример неверен:
$("a[id*=LogoLink]").click(CheckValuesChanged(InitialDictionary));
Это должно быть:
$("a[id*=LogoLink]").click(CheckValuesChanged);
Но поскольку вы хотите передать InitialDictionary
в качестве аргумента, вам нужно использовать первый подход, который зафиксирует это в анонимной функции.
Комментарии:
1. Нет, если OP хочет параметр
2. Не могу ли я передать параметр в функцию? Потому что я хочу повторно использовать этот метод в нескольких вызовах .click (…).
3. @Dante, да, ты можешь, используя первый подход.