2015-02-11 2 views
0

Вот обычная функция конструктора. Мой вопрос в том, как она будет лексической средой при вызове через новую? А именно, он там или нет?Функция конструктора лексической среды

function Func() { 
    var a = 10; 

    this.method = function() { 
     // code 
    }; 

    function f() { 

    } 
} 

Справа?

Lexical environment = { 
    a: undifined, 
    f: function 
} 

[[Scope]] -> window 
+1

o: вновь созданный объект. – Teemu

+0

То есть this.method = function() {// code}; пропускает лексическую среду? – Aleksandr

+1

Да, чтобы ссылаться на вновь созданный объект в 'method', вы должны определить' this' для переменной во внешней области. 'method' находится в области' Func', а код в 'method' входит в область самой функции. – Teemu

ответ

1

именно this.method он получает там или нет?

No, .method становится собственностью экземпляра объекта. Это не становится переменной в лексической среде.

Справа?

Да, ваша диаграмма выглядит нормально.

execution context (contained in the stack) 
    lexical environment  <----, 
    outer: [global scope]  | 
    environment: {    | 
     a: 10,      | 
     f: function {    | 
     [[scope]]: environment --´ 
     [[code]]: … 
     prototype: … 
     } 
    } 
    variable environment: (same as lexical) 
    this binding: object { 
    [[prototype]]: Func.prototype 
    method: function {…} 
    } 
+0

Большое спасибо за ваш ответ. Мне очень нравятся ваши ответы! Посмотрите на этот код: http://jsfiddle.net/shhwnxsr/ Я пытаюсь справиться с этим, и у меня есть несколько вопросов, на которые вы не могли бы ответить на них. Я задавал вопросы в комментариях. – Aleksandr

+1

'var parentEnable = this.enable' является ссылкой на функцию, которую Machine пишет в свойстве' .enable' созданного объекта. Когда он вызывается, это '[[scope]]' все еще указывает на его - не-garbagecollected - родительскую лексическую среду (созданную при вызове 'Machine') и которая используется в цепочке областей видимости (' outer') для нового контекста выполнения. См. Также http://stackoverflow.com/q/111102/1048572 – Bergi

+0

Правильно ли я понимаю, что [[Область]] parentEnable указывает на Машину? – Aleksandr

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