Я наткнулся на что-то странное, и я хотел поделиться им с вами, чтобы вы могли помочь моему разочарованию. (мне потребовалось некоторое время, чтобы понять, что не так)Объект контекста контекста javascript необъявленные переменные
Я хотел создать рекурсивную функцию, которая бы отображала дерево как структуру данных на вложенном элементе <ul>
.
Структура данных была в таком виде:
var contents = [
{
name : 'test',
contents : [
{
name : 'test > test 1'
},
{
name : 'test > test 2'
},
{
name : 'test > test 3'
}
]
},
{
name : 'test 2'
}
];
Я добавил свой код на предметном блоке, например:
var dummy = {
do : function() {
var element = $('<ul>');
dummy.recursive(element, contents);
$("#content").append(element);
},
recursive : function(element, contents) {
for(i = 0; i < contents.length; i++) {
var item = contents[i];
var li = $('<li> (' + i + ') ' + item.name + '</li>');
if(item.contents && item.contents.length) {
var ul = $('<ul>');
dummy.recursive(ul, item.contents);
li.append(ul);
}
element.append(li);
}
}
};
Я обнаружил, что переменная i
после dummy.recursive
побежал на содержимое первого элемента больше не было 0, а вместо 2. Это означает, что хотя i
находится в его личном контексте, заменяется рекурсивной функцией.
Я также добавил jsfiddle, чтобы проиллюстрировать эту проблему здесь: http://jsfiddle.net/MWQJC/2/
Проблема заключается в переменной i
не объявлена явно делая var i = 0
на начало функции. (Как проиллюстрировано здесь: http://jsfiddle.net/h8gtd/1/)
По-видимому, по умолчанию всякая необъявленная переменная, доступ к которой создается, создается в области объекта. Это так?
Там действительно есть еще один урок, знайте основы, прежде чем начинать делать сложные вещи. Если бы вы прочитали какую-либо книгу на javascript, одна из первых вещей, которую вы узнали бы, это определение областей, переменных дециляций и подъемов, а также использование IIFE. – adeneo
@adeneo Ну, исходя из другого фона разработки, вы неправильно думаете, что JS прост и, как правило, переходит к более сложным вещам. Touche ... – mobius