![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
04.08.2011, 22:10
|
Особый гость
|
|
Регистрация: 02.04.2010
Сообщений: 4,260
|
|
Сообщение от dmitriymar
|
по второму пункту -есть какаято существенная разница между ними?
|
из какого примера?
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
04.08.2011, 22:16
|
х.з
|
|
Регистрация: 21.11.2010
Сообщений: 4,588
|
|
Сообщение от monolithed
|
из какого примера?
|
вызов анонимных функций
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
04.08.2011, 22:26
|
Особый гость
|
|
Регистрация: 02.04.2010
Сообщений: 4,260
|
|
Сообщение от dmitriymar
|
вызов анонимных функций
|
кроме теории, никакой, также как и между третьей. Главное чтобы фунция была объявлена как Function Expression:
//1
var foo = function() {};
//2
var foo = new function() {};
//3
var foo = function() {
return function() { //и эта тоже Function Expression
//..
}
}
//4
foo(function() {
//..
});
var foo = {
bar : function() {
}()
};
//5
0,function() {}; //,[] ,{}, ,'' ,любой объект
!function() {}; // ,+ ,- ,~ ,!
//6
(function() {
})(); //}())
// конструкции ниже, не относится ни к FE ни к FD:
//7
[].constructor(function() { //,[] ,{}, ,'' ,любой объект
}());
//8
(Function('alert("..")'))();
//и даже без единого слова function
([].constructor.constructor(
//..
)
)();
и так далее..
т.е. основное визуальное отличие Function Expression от Function Declaration в том, что Function Expression не может начинаться с ключевого слова function , за исключением, возврата каретки. Более подробно можно тут
Последний раз редактировалось monolithed, 04.08.2011 в 23:08.
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
04.08.2011, 22:45
|
х.з
|
|
Регистрация: 21.11.2010
Сообщений: 4,588
|
|
monolithed,
![Thanks](https://javascript.ru/forum/images/smilies/thank_you2.gif)
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
06.08.2011, 11:33
|
![Аватар для Isaac](https://javascript.ru/forum/image.php?u=14894&dateline=1312380119) |
Кандидат Javascript-наук
|
|
Регистрация: 03.08.2011
Сообщений: 106
|
|
Сообщение от monolithed
|
Три наиболее часто используемых подхода, какой выберешь в конкретной ситуации?
<div id="div">
<p></p>
<p></p>
</div>
<script>
var p = document.getElementById('div').getElementsByTagName('p'),
i = p.length;
while(i--) {
p[i].innerHTML = p[i].nodeName;
}
</script>
<div id="div">
<p></p>
<p></p>
</div>
<script>
var p = document.getElementById('div').children,
i = p.length;
while(i--) {
p[i].innerHTML = p[i].nodeName;
}
</script>
<div id="div">
<p></p>
<p></p>
</div>
<script>
var p = document.getElementById('div').childNodes,
i = p.length;
while(i--) {
if(p[i].nodeName === 'P' && p[i].nodeType === 1)
p[i].innerHTML = p[i].nodeName;
}
</script>
Ты сегодня не пил? ![](https://javascript.ru/forum/images/smilies/smile.gif)
//в этом случае сперва происходит группировка, затем вызов, как Function Expression
(function() {
alert(this);
})();
//сперва происходит объявление функции как Function Expression и вызов, затем закрывается оператор группировки
(function() {
alert(this);
}());
//объявление функции как Function Expression и вызов, оператор группировки в этом случае не нужен
!function() {
alert(this);
}();
ничего подобного, если это касается конкретного примера.
// как в Python
if(0 == 1)
alert(false)
else if(1 == 2)
alert(false)
else
alert('не то не другое не верно');
//так советует Д. Крокфорд
if(0 == 1) {
alert(false)
}
else if(1 == 2) {
alert(false)
}
else {
alert('не то не другое не верно');
}
// менее читабелен, но все же рабочий
if(0 == 1) alert(false); else if(1 == 2); else alert('не то не другое не верно');
// тоже самое, что и передыдущий
if(0 == 1) alert(false);
else if(1 == 2);
else alert('не то не другое не верно');
//из всех вариантов, лично я выберу этот
alert(0 == 1 ? 0 : 1 == 2 ? 0 : 'не то не другое не верно');
ты наверно не поверишь, но даже так работает:
<div id="div">
<p></p>
<p></p>
</div>
<script>
var
p
=
document
.
getElementById
(
'div'
)
.
childNodes
,
i
=
p
.
length
;
while
(
i--
)
{
if
(
p
[
i
]
.
nodeName
===
'P'
&&
p
[
i
]
.
nodeType
===
1
)
alert
(
p
[
i
]
.
nodeName
)
}
;
</script>
Как говорится, вкус и цвет, товарищей нет, главное незагнаться
|
Красава, плюсую!
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
06.08.2011, 12:08
|
![Аватар для Isaac](https://javascript.ru/forum/image.php?u=14894&dateline=1312380119) |
Кандидат Javascript-наук
|
|
Регистрация: 03.08.2011
Сообщений: 106
|
|
Сделал следующим способом
window.onload = function()
{
var distance = 1,
speed = 0.5,
li = document.getElementById("lists").children,
count = 1,
i = 0;
(function ()
{
distance = distance + speed;
document.getElementById("playBar").style.top = distance + "px";
if(distance == li[count].offsetTop)
{
setTimeout(arguments.callee, 1500);
count ++;
}else
setTimeout(arguments.callee, 10);
if(distance == 260)
speed = 0;
}());
};
Но, в ES5 свойство arguments.callee недоступно в строгом режиме, поэтому спецификация советует лучше воздерживаться от его использования в будущем, а также удалять все обращения к этому свойству.
Подскажите, чем я могу заменить в данном случае свойство arguments.callee ?
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
06.08.2011, 12:32
|
![Аватар для Aetae](https://javascript.ru/forum/image.php?u=4993&dateline=1299014303) |
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,590
|
|
(function eternal(){
setTimeout(eternal,1000)
})()
alert(window.eternal)
__________________
29375, 35
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
06.08.2011, 17:34
|
![Аватар для Isaac](https://javascript.ru/forum/image.php?u=14894&dateline=1312380119) |
Кандидат Javascript-наук
|
|
Регистрация: 03.08.2011
Сообщений: 106
|
|
Сообщение от Aetae
|
(function eternal(){
setTimeout(eternal,1000)
})()
alert(window.eternal)
|
Спасибо,а еще есть варианты ?
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
07.08.2011, 12:17
|
![Аватар для Isaac](https://javascript.ru/forum/image.php?u=14894&dateline=1312380119) |
Кандидат Javascript-наук
|
|
Регистрация: 03.08.2011
Сообщений: 106
|
|
Подскажите, что сделал не так?
Предыдущий код работал отлично, но я решил сделать все в объекте, теперь перестало работать, не могу понять причину ![Sad](https://javascript.ru/forum/images/smilies/sad.gif)
И стоит ли так часто обращаться к this ?
var PLAYDIV = PLAYDIV || {
li : document.getElementById("lists").children,
playDiv : document.getElementById("playBar"),
speed : 10,
delay : 1300,
distance : 1,
plus : 0.5,
count : 1,
i : 0,
_getPlay: function() {
this.distance = this.distance + this.plus
this.playDiv.style.top = this.distance + "px"
if(this.distance == this.li[this.count].offsetTop)
{
var timer1 = setTimeout(arguments.callee, this.delay)
this.count ++;
}else
var timer2 = setTimeout(arguments.callee, this.speed)
if(this.count == this.li.length)
{
this.plus = 0
clearTimeout(timer1)
clearTimeout(timer2)
timer1 = null;
timer2 = null;
this.playDiv.parentNode.removeChild(this.playDiv);
}
}
};
PLAYDIV._getPlay()
|
|
|
|