Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!

Есть ли в JavaScript аналоги декларациям/аннотациям (термины из Python/Java соответственно)?
@delay(1000)
def foo(object):
// code here
var foo = function () {
// code here
}.delay(1000);
// или так:
var foo = delay(1000, function () {
// code here
});
Function.prototype.delay = function ( time ) {
var origFn = this;
return function () {
setTimeout( origFn, time );
}
}


var asyncFunc = function (n)
{
console.log(n);
};
var count = 5;
for (var i = 0; i < count; i++)
{
window.setTimeout(function()
{
asyncFunc(i);
}, 10000 * i);
}
for (var i = 0; i < count; i++)
{
window.setTimeout('asyncFunc(' + i + ')', 10000 * i);
}
for (var i = 0; i < count; i++)
{
(function(i) {
return window.setTimeout(function()
{
asyncFunc(i);
}, 10000 * i);
})(i);
}
for (var i = 0; i < count; i++) with ({ i: i }) {
window.setTimeout(function() {
asyncFunc(i);
}, 10000 * i);
}for (var i = 0; i < count; i++) {
window.setTimeout(asyncFunc.bind(null, i), 10000 * i);
}a = function(){
//...
delete a;
}
то могу попасть на утечку памяти: когда функцию удаляю, она исполняется, поэтому физически удалена быть не может. Когда будет выполнена — она останется в памяти, но все указатели уже удалены. Происходит ли такое на практике, читали ли Вы об этом?a = function(){
//...
var f = arguments.callee;
setTimeout(function(){delete f;},1);
}
но, во-первых, это почему-то не работает и не даёт ошибку, во-вторых, функция не выполняется, но используется её SCOPE. Поэтому, возможно, она тоже не удалится. Работает так:c = function(){
//...
setTimeout(function(){delete c;},1);
}
c();b = function(){
//...
f = arguments.callee;
setTimeout(function(){delete f;},1);
}[[DontDelete]].Например, функции, упомянутые в скрипте на некоторой странице, следовательно, никогда не удалятся? А если кто-то будет держать скопы через ссылки (создаст объект, запоминающий каждую временную функцию, создаваемую в скрипте) — тоже?Не удаляется.
var b = 100;
var a = function (bb) {
var c = 100;
return c * bb;
}
a = a(b);<script>onload = function(){
function resetEvents(element){
var newEl = element.parentNode.insertBefore(element.cloneNode(true), element);
element.parentNode.removeChild(element);
return newEl;
}
document.getElementById('bb').addEventListener('click', function(){alert(2)},!1);
resetEvents(document.getElementById('bb'))
}</script>
<div><b id="bb" onclick="alert(1)">пример</b> <i>шум</i></div>window.clipboardData.setData("Text", "PewPewPew");Ctrl+C — см. goo.gladdEventListener(a, b, true);?stopPropagation()event.stopPropagation(), чтобы сработал пример 1. jsfiddle.net/azproduction/bbQ42/var MyVarName;'MyVarName' из JS?for (var name in window) {
console.log(name);
}
var test = function a(b,c,d) {};
// Function name
var name = test.name || // Modern browsers
String(test).match(/function(?:\s*)?([a-zA-z$_][a-zA-z$_]*)?/)[1]; // IE
// Arguments
var args = String(test).split(')')[0].split('(')[1].split(/,\s?/); :before и :after через JS?content.#elem. Мы хотим поменять css-свойство :before те фактически добавить блок:#elem:before {content: "pewpew"; color: red;}
document.styleSheets[0].insertRule('#elem:before {content: "pewpew"; color: red;}', 0);
document.styleSheets[0].cssRules[0].style.сolor= '#555'; // Меняем
document.styleSheets[0].addRule('#elem:before', 'content: "pewpew"; color: red;', 0);
document.styleSheets[0].rules[0].style.сolor= '#555;
for(var t=0;t<10;t++){
console.time('native'+t);
var res = 0;
for(var idx = 0; idx < 1000; idx++){
res = Math.round( Math.random()*((new Date()).getTime()/idx) )
};
console.timeEnd('native'+t);
console.time('eval'+t);
var res = 0;
for(var idx = 0; idx < 1000; idx++){
eval('res = Math.round( Math.random()*((new Date()).getTime()/idx) )')
};
console.timeEnd('eval'+t);
}
native0: 6.568ms VM11296:10
eval0: 28028.307ms VM11296:18
native1: 9.370ms VM11296:10
eval1: 28053.163ms VM11296:18
native2: 6.128ms VM11296:10
eval2: 28058.792ms VM11296:18
native3: 6.266ms VM11296:10
eval3: 28059.410ms VM11296:18
native4: 5.758ms VM11296:10
eval4: 28071.947ms VM11296:18
native5: 5.366ms VM11296:10
eval5: 28079.450ms VM11296:18
native6: 7.372ms VM11296:10
eval6: 28091.091ms VM11296:18
native7: 8.352ms VM11296:10
eval7: 28088.152ms VM11296:18
native8: 6.371ms VM11296:10
eval8: 28073.608ms VM11296:18
native9: 6.120ms VM11296:10
eval9: 28083.928ms VM11296:18
for(var t=0;t<10;t++){
console.time('native'+t);
var res = 0;
for(var idx = 0; idx < 1000; idx++){
res = Math.round( Math.random()*((new Date()).getTime()/idx) )
};
console.timeEnd('native'+t);
console.time('eval'+t);
var res = 0;
for(var idx = 0; idx < 1000; idx++){
eval('res = Math.round( Math.random()*((new Date()).getTime()/idx) )')
};
console.timeEnd('eval'+t);
console.time('func'+t);
var res = 0;
for(var idx = 0; idx < 1000; idx++){
void function( idx ){
res = Math.round( Math.random()*((new Date()).getTime()/idx) )
}( idx )
}
console.timeEnd('func'+t);
}
native0: 2.552ms VM40121:10
eval0: 75.564ms VM40121:18
func0: 4.598ms VM40121:28
native1: 4.724ms VM40121:10
eval1: 63.414ms VM40121:18
func1: 6.070ms VM40121:28
native2: 3.579ms VM40121:10
eval2: 66.886ms VM40121:18
func2: 6.601ms VM40121:28
native3: 4.170ms VM40121:10
eval3: 61.786ms VM40121:18
func3: 5.309ms VM40121:28
native4: 4.719ms VM40121:10
eval4: 69.186ms VM40121:18
func4: 5.035ms VM40121:28
native5: 4.029ms VM40121:10
eval5: 66.522ms VM40121:18
func5: 5.816ms VM40121:28
native6: 5.628ms VM40121:10
eval6: 72.350ms VM40121:18
func6: 4.726ms VM40121:28
native7: 4.374ms VM40121:10
eval7: 68.818ms VM40121:18
func7: 5.549ms VM40121:28
native8: 5.118ms VM40121:10
eval8: 73.261ms VM40121:18
func8: 6.945ms VM40121:28
native9: 5.579ms VM40121:10
eval9: 73.521ms VM40121:18
func9: 5.297ms VM40121:28
JavaScript F.A.Q: Часть 2