2013-09-13 2 views
1

У меня достаточно знаний, когда дело доходит до HTML/CSS/PHP/MySQL, но Javascript по-прежнему является огромным препятствием для меня. По какой-то причине мой учитель хочет, чтобы мы упростили эту глупую часть кода, но как бы это сделать?Javascript: упрощающий код, confused

function f(a, b, c) { 
    return function() { 
     return a[b](c); 
    } 
} 
window.onload = f(document, "write", "hi!"); 

Я думал

function f(a, b, c) { 
    return a[b](c); 
} 
window.onload = f(document, "write", "hi!"); 

, но это не может быть просто это просто, правда? Толчок в правильном направлении был бы очень обязан!

Редактировать: Спасибо, ребята. Вместо того, чтобы дать мне толчок, вы ушли от своих путей (безумное количество людей даже, эй), чтобы создать это для меня. К счастью, все, что он хотел знать, это то, как я буду заниматься этим, и это все Javascript для этого года. Весьма признателен!

+1

второй запускает функцию сразу ... – epascarello

+0

Ваши 2 примера не эквивалентны. Первый возвращает функцию (закрытие). Второй возвращает 'undefined', поскольку функция запускается немедленно. –

+0

@Mave, Посмотрите на мой ответ, это самый простой способ записать эквивалентный код в ваш первый образец. Решение, предлагаемое @bigcakes, не эквивалентно, поскольку он игнорирует обработчик 'window.onload'. – plalx

ответ

3

Я думаю, он хочет, чтобы вы поняли, что вызов f возвращает другую функцию.

function f(a, b, c) { 
    return function() { 
     return a[b](c); 
    } 
} 

Это функция, которая при запуске возвращает другую функцию. Так

window.onload = f(document, "write", "hi!"); 

заканчивает тем, что что-то вроде

window.onload = function() { return a[b](c); } 

где a, b и c привязаны к значениям, которые вы передали в.Поэтому напишите что-нибудь подобное, но замените a, b и c с правильными значениями. Он заканчивается return document["write"]("hi"), который также можно записать return document.write("hi"). Подключите это:

window.onload = function() { 
    return document.write("hi"); 
} 

Это эквивалентно.

2

Или просто document["write"]("hi");

Другой способ document.write("hi");

Edit: К сожалению, забыл вам нужно сделать это OnLoad,

window.onload = function() { 
    return document.write("hi"); 
} 
+0

Ну, это не эквивалентно, так как вам не хватает обработчика onload. – plalx

+0

Да, это было еще более очевидным, но я проигнорировал это как слишком простое .. может также дать ему шанс. Спасибо чувак! edit: whoops, обработчик onload отсутствует – Mave

+0

Да, я забыл, что вам нужно сделать это onload, извините за это! Удачи вам в javascript, это очень весело. – bigcakes

2

Может быть, он просто думает о

window.onload = function() { 
    document.write("hi"); 
}; 

(что, кстати, является глупый пример, который ждет, пока страница загрузится, чтобы перезаписать ее с помощью «привет».)

2

Это возможно?

window.onload = document.write.bind(document, 'hi!'); 
2

Ваше предлагаемое решение не работает: document.write будет работать сразу же, когда f называется, а не в ответ на load события. Исходная функция f фактически возвращает новую функцию; ваш пример немедленно вызывает функцию и возвращает результат.

Если вы посмотрите на MDN page on window.onload, вы увидите, что onload должен быть установлен на функцию:

window.onload = function() { 
    init(); 
    doSomethingElse(); 
}; 

Очевидно, что код должен document.write сообщение, поэтому поставить этот код внутри обработчика onload функции , У вас будет более короткий (но гораздо менее абстрактный) код, который достигнет такого же эффекта.

1

Я уверен, что ваш инструктор хочет сохранить абстрактную функцию, то есть без встроенных в нее значений. Таким образом, вы можете передать ЛЮБОЙ объект, метод и значение, и он будет работать. Твой очень близко. Другие обратили внимание на некоторые вопросы. Это должно работать, если вы хотите, чтобы код для выполнения при загрузке страницы:

function f(a, b, c) { 
    a[b](c); 
} 
f(document, "write", "hi!"); 

Вы можете держать обработчик OnLoad, но имейте в виду, что он будет полностью перезаписывать существующий документ. Может, чувак хочет этого. Тем не менее, это звучит глупо. Это будет выглядеть так:

function f(a, b, c) { 
    a[b](c); 
} 
window.onload = function() { 
    f(document, "write", "hi!"); 
};