2015-01-16 4 views
-2

Я новичок в Javascript, и мой фон - Java. Почему мне нужно изменить var value = val; на this.value = val;, поэтому я не получаю «неопределенную» ошибку, когда я использую console.log(node.value); для распечатки значений, которые я нажал, но не нужно менять var next = {}; на this.next = {};?Зачем мне нужно менять `var value = val;` на `this.value = val;` поэтому я не получаю ошибку «undefined»?

var LinkedList = function(e) { 
    var first, last; 

    var Node =function(val) { 
    var value = val; 
    var next = {}; 
    } 
    this.push = function(val) { 
    var node = new Node(val); 
    if (first == null) { 
     console.log(node.value); 
     first = last = node; 
    } 
    else { 
     console.log(node.value); 
     last.next = node; 
     last = node; 
    } 
    } 
} 

var list = new LinkedList(); 
list.push(1); 
list.push(2); 
list.push(3); 
+0

'var value' должно быть, должно быть' this.value' – Pointy

+1

«Получить неопределенную ошибку» * где * точно? Кроме того, ваш 'var Node = function ..' практически ничего не делает, как есть. Это довольно бессмысленно, если вы не используете 'this.'. – deceze

+0

Я бы предположил, что у вас проблемы, потому что есть конфликт с «Node», который является нативной функцией. –

ответ

0

Использование ключевого слова 'var' в методах объектов (включая его конструктор) делает эту переменную приватной. Хотя вы можете получить доступ к нему в других методах «привилегии» этого объекта, вы не можете получить доступ к ним за пределами этих объектов. Поэтому, пытаясь получить вас undefined.

И наоборот, использование этого.name для назначения переменной делает ее общедоступной, что означает попытку доступа к ней из-за пределов объекта.

Я нашел эту статью полезной в этой теме. http://javascript.crockford.com/private.html

+0

Благодарим за помощь, @Cameron McCluskie –

0
  1. Вы не получаете ошибку, ваша регистрация оператор просто выводит undefined, потому что node не имеет свойство value.

  2. Это по существу ничего не делает:

    var Node = function(val) { 
         var value = val; 
         var next = {}; 
        } 
    

    вы определяете два локально контекстные переменные, но никогда ничего не получить доступ к этим переменным. Переменные недоступны вне этого литерала function() { }. Переменные first и last вашего LinkedList работают одинаково. Попробуйте console.log(list.first), это undefined.

    Если вы хотите создать свойства value и next на новый экземпляр объекта (this), вам нужно сделать это с this.value и this.next.

  3. Причина вы не видите никаких проблем с next, потому что вы никогда не выводить его, и вы явно создать его в любом случае здесь:

    last.next = node; 
    

    До этой линии .next свойство не Ждут» t существует.

+0

Благодарим вас за помощь @deceze. –

Смежные вопросы