- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
function highlight(a, b) {
if (b == 2) {
var c = a.parentNode.parentNode
}
if (b == 3) {
var c = a.parentNode.parentNode.parentNode
}
if (b == 4) {
var c = a.parentNode.parentNode.parentNode.parentNode
}
addClassName(c, "focused", true);
var d = getElementsByClassName(document, "*", "focused");
for (i = 0; i < d.length; i++) {
if (d[i] != c) {
removeClassName(d[i], "focused")
}
}
}
норм, 4 уровня родители, вычисление длины массива в цикле d.length и какая то бессмысленная проверка if (d[i] != c), куча var, в общем буээ
http://www.flatsoft.com/js/wufoo.min.js
var в ЯваСкрипте по правилам хорошего тона пишут один раз в функции, в самом верху. Есть люди, которым правила хорошего тона не нравятся, но меня, например, коробит, когда var используют где-то внутри блоков. Это потому, что все локальные переменные функции интерпретатором все равно "объявляются" в самом начале. Два раза объявлять одну и ту же переменную, как это сделано здесь - нет смысла / только путает. Ну и вообще, не понятно, чего ожидал автор когда, например, случилось бы, что b = 5.
Поэтому я тоже двумя руками за правило "писать var в начале функции".
Мое имхо - лучше бы глобальные переменные помечались кейвордом var (или global), а остальные имели бы лексическую видимость. Так было бы интуитивнее и безопаснее.
Во. let сделали.
Я понял почему вы так подумали.
{ для вас аналог in, но семантически это не так.
В хаскеле let ... in x вертает x, в то время как в этом языке let ... {} вертает условно говоря void.
В clojure (да и вообще во всех лиспах) let работается также, как и в Haskell, т.е. возвращает выражение.
Cхожесть, видимо, в том, что изменяется привязка имён в рамках куска кода. Однако же хаскелевский let тоже может временно менять биндинги переменных, хотя это обычно и не желательно. Если, конечно, в JavaScript не ввели динамическую область видимости переменных.
?
По крайней мере для тех кто когда-либо в сиподобных наступал на silent overflow.
[code language='javascript']
if (b == 2) {
var c = a.parentNode.parentNode
}
if (b == 3) {
var c = a.parentNode.parentNode.parentNode
}
if (b == 4) {
var c = a.parentNode.parentNode.parentNode.paren tNode
}
[/code]
Можно было бы заменить на это:
[code language='javascript']
if(b>=2 && b<=4){
var c = a
for(var i=0;i<b;i++){
c = c.parentNode
}
}
[/code]