Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   нужна задача, чтобы попрактиковаться)) (https://javascript.ru/forum/misc/20819-nuzhna-zadacha-chtoby-popraktikovatsya.html)

melky 23.08.2011 10:10

вспомнилась зачада с яндекса, которая поставила тогда меня в тупик

что вернёт функция?

(function f() {
    function f() { return 1 }

    return f();

    function f() { return 2 }
})();

B@rmaley.e><e 23.08.2011 12:04

По-моему, задача не представляет сложности, если знать различия Function Declaration и Function Expression.

ваый 23.08.2011 12:40

Вот вам реальная простенькая задачка, которая недавно возникла.

Реализовать функцию getWords(id), которая:

1. принимает в качестве аргумента строку css селектора (для простоты просто id dom элемента);
2. возвращает массив слов содержащихся внутри этого элемента, в том числе и в дочерних.

Достаточно просто, но прикольно для начинающих. Тут и немного работы с dom, и в целом полезно.

SlavaPav 23.08.2011 21:40

Мой вариант реализации самоопределяемой функции:
var displayName = (function() {
    function func() {
        alert('First name');
        func = function() {
            alert('Second name');
        };
    }
    
    return function() {
        func();
    };
})();

displayName();
displayName();

// Более удобный вариант
function memoize(init, main) {
    function current() {
        init.apply(null, arguments);
        current = main;
    }
    
    return function() {
        current.apply(null, arguments);
    };
}

var displayName = memoize(function() {alert('First name');}, function() { alert('Second name');});

displayName();
displayName();

melky 25.08.2011 02:15

сейчас пришла в голову ещё одна задачка. мне кажется, она будет зубодробительной :)

я сам то её решил.

и да... работать эта задачка будет только в FF (версия - хз, свежая).

итак, вот код с комментами, вместо условия.

как сделать так, чтобы ....

<div id=a>0</div>

<script>
a=document.getElementById('a');

/* тут пропущенный кусок моего кода */


// всё хорошо. при клике к содержимому
// будет добавляться буква 'abc'
// всё статично
a.onclick = function(){ a.innerHTML += 'abc' };
</script>

... чтобы при клике по div к его innerHTML прибавлялись не 'abc', а 'ABC' ?

melky 25.08.2011 02:21

в самом конце :)

а код нельзя менять.

только дописать свой кусок. местонахождение определено комментами /**/

B@rmaley.e><e 25.08.2011 08:03

Цитата:

работать эта задачка будет только в FF (версия - хз, свежая).
Опера, хромиум, FF5+:
<div id=a>0</div>

<script>
a=document.getElementById('a');

/* тут пропущенный кусок моего кода */
(function(){
  var cached = a.innerHTML;
  a.__defineGetter__('innerHTML', function(){
    return cached;
  });
  a.__defineSetter__('innerHTML', function(b){
    cached = b.toUpperCase();
    var div = document.createElement('div');
    div.innerHTML = cached;
    for(var i = 0, length = a.childNodes.length; i < length; ++i){
      a.removeChild(a.childNodes[i]);
    }
    for(var i = 0, length = div.childNodes.length; i < length; ++i){
      a.appendChild(div.childNodes[i]);
    }
  });
})();

// всё хорошо. при клике к содержимому
// будет добавляться буква 'abc'
// всё статично
a.onclick = function(){ a.innerHTML += 'abc' };
</script>

devote 25.08.2011 08:28

Цитата:

Сообщение от B@rmaley.e><e
Опера, хромиум, FF5+:

Ты зачем решил? Задачки то для новичков специально, а ты им подсказки даешь.

Но то что melky, заявил тока про FF я тоже улыбнулся, геттеры и сеттеры давно поддерживаются и другими... Кроме любимого ИЕ =)

B@rmaley.e><e 25.08.2011 08:34

devote, специально скрыл, желающие потом смогут посмотреть решение. Ну и оно для всех нормальных браузеров, а не только FF.
Цитата:

Сообщение от devote
давно поддерживаются и другими

Ну, может он решил её как-нибудь иначе. Мало ли чего Mozilla могли напихать в свой движок.

devote 25.08.2011 08:42

Цитата:

Сообщение от B@rmaley.e><e
Ну, может он решил её как-нибудь иначе.

хотелось бы посмотреть на его решение =)


Часовой пояс GMT +3, время: 04:52.