Запустить! => ошибка: 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, время: 00:47. |