Запустить! => ошибка: Unexpected token &
Chrome. |
Riim,
Движок форума преобразовал юникодовые неразрывные пробелы в Плохая идея была их использовать Так должно заработать: var foo = "-~/ "; foo = foo + ""; alert( !!~eval(foo + " / -.5") ); /* true */ alert( eval( foo + "+" + foo ) ) /* 1 */ alert( eval( foo + foo + "+" + foo + foo ) ) /* 2 */ alert( eval( foo + foo + foo + "+" + foo + foo + foo ) ) /* 3 */ alert( eval(foo + foo + foo + foo + "+" + foo + foo + foo + foo) ) /* 4 */ // и так далее |
Совсем простенькая
alert(sum()); // ==> 0 alert(sum(2)); // ==> 2 alert(sum(1)(2)(3)); // ==> 6 alert(sum(4)(8)); // ==> 12 // и т.д. Определить sum |
http://javascript.ru/basic/closure#zabavnyy-primer
Вот чему :)))))))))) |
Shaci,
на 3-х и более элементах тот пример не сработал. Длина ряда произвольна. |
function sum(a) { return function(b) { return function(c) { return a + b +c; } } } alert(sum(3)(4)(5)); Вот тебе для трех, я на js давно не писал. но думаю можно переписать с легкостью этот код и на произвольное число аргументов. |
var sum = function(a){ var fnc = function(a){ fnc.value += a || 0; return fnc; }; fnc.value = a || 0; fnc.toString = toString; return fnc; }, toString = function(){ return this.value }; alert(sum()); // ==> 0 alert(sum(2)); // ==> 2 alert(sum(1)(2)(3)); // ==> 6 alert(sum(4)(8)); // ==> 12 // и т.д. |
В поисках логического обоснования:
((0)['constructor']['constructor'](//числа могут быть любыми и не обязательно соответствовать друг-другу ( (0)['constructor']['constructor'] ('return unescape') )() ('al%65rt%28%22Hello%20World%21%22%29') ) )(); Как может вы уже догадались работает по принципу: eval(unescape('al%65rt%28%22Hello%20World%21%22%29')) |
((0)['constructor']['constructor']( ( (0)['constructor']['constructor'] ('return unescape') )() ('al%65rt%28%22Hello%20World%21%22%29') ) )(); (0)['constructor'] == Number Number['constructor'] == Function (Function( ( Function ('return unescape') )() ('al%65rt%28%22Hello%20World%21%22%29') ) )(); Если растянуть (Function((Function('return unescape'))()('al%65rt%28%22Hello%20World%21%22%29')))(); Function('return unescape') == function() { return unescape; } (Function('return unescape'))() == (function() { return unescape })() == unescape (Function(unescape('al%65rt%28%22Hello%20World%21%22%29')))(); (Function('alert("Hello World!")'))(); (function() { alert("Hello World!") })(); |
0 — число. При взятии у него свойства оно преобразовавыется в объект. У объекта есть функция-конструктор. У конструктора есть свой конструктор —
Function .Получаем ( Function( (Function ('return unescape'))()('al%65rt%28%22Hello%20World%21%22%29') ) )(); Уже ближе. (Function ('return unescape'))() создает функцию и сразу же её выполняет. Результатом будет функция unescape , определенная в глобальном скопе.( Function( unescape('al%65rt%28%22Hello%20World%21%22%29') ) )(); ну, и (Function('alert("Hello World!")'))(); Т.е., опять-таки, функция объявляется и сразу запускается. alert("Hello World!") |
Часовой пояс GMT +3, время: 14:52. |