Muranx
@Muranx
кто понял this тот в цирке не смеётся

Где в данном случае создалась переменная?

Здравствуйте !
Заранее извиняюсь за столь странную реализацию, но я эксперементировал !

$O = Object;
$c = console;

function F(){
  var that = this;
  this.a = 10;
  var A = this.a;
    return function(){
        $c.log(($O.getPrototypeOf(that) === F.prototype));
        $c.log(($O.getPrototypeOf(this)));
        $c.log(A); 
    };
};

var b = new F(); 

b();              // true
                  // [ Object Window ]
                  // 10

$c.log(window.a); // undefined
$c.log(b.a);      // undefined


Во первых, для меня было странным то, что при вызове конструкции new F( ) не создался объект, ну в принципи я допустил, что в переменную b записалась возвращаемая из функции F( ) функция, НО вся загвоздка в том, где создалась переменная A??? Если typeof(b) === "function" - true, в window.a и в b.a её собственно нету, тогда где она, в каком она находится объекте? Т.к. в теле возвращаемой функции её значение очень даже доступно, но где тот объект, свойством которого она является? И как получить к нему доступ? Буду очень признателен за ответ, особенно с подробностями, как это можно вычислить, т.к. кроме typeof( ) и обращения к свойствам объекта в теле функции через console.log( ) у меня нет никаких знаний! Спасибо!

  • Вопрос задан
  • 99 просмотров
Решения вопроса 1
Robur
@Robur
Знаю больше чем это необходимо
НО вся загвоздка в том, где создалась переменная A???


Создалась внутри функции F

тогда где она, в каком она находится объекте? Т.к. в теле возвращаемой функции её значение очень даже доступно, но где тот объект, свойством которого она является?


Это специальный объект - контекст выполнения. Гуглите execution context.

И как получить к нему доступ?

никак, к нему нельзя получить доступ напрямую - только использовать переменные которые в нем определены

На самом деле то что происходит в реальности - зависит от движка и там и объекта может и не быть как такового. Но для простоты понимания, считайте что он есть и доступа к нему никакого нет.

вот тут почитайте https://codeburst.io/js-demystified-04-execution-c...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Athanor
@Athanor
Лайк + Решение: не жмись, нажми
Во первых, для меня было странным то, что при вызове конструкции new F( ) не создался объект, ну в принципи я допустил, что в переменную b записалась возвращаемая из функции F( )

А это, кстати, происходит потому что вы возвращаете не примитивное значение в функции-конструкторе.

Подробней

Если хотите получить a в объекте, возвращенном функцией, конструктором, нужно убрать returnиз F
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы