Странное поведение, такое как динамическое копирование в Javascript

У меня есть следующий код для тестирования:

// Generated by CoffeeScript 2.2.3
(function() {
  var t, test;

  test = function() {
    var dynamic_scoped_function, nested_function, vairable_function;
    dynamic_scoped_function = function() {
      return console.log(`variable function value: ${vairable_function()}`);
    };
    vairable_function = function() {
      return "not in nested function";
    };
    nested_function = function() {
      var nested_caller;
      vairable_function = function() {
        return "in nested function";
      };
      nested_caller = function() {
        console.log("calling dynamic scoped function from nested...");
        return dynamic_scoped_function();
      };
      return {
        vairable_function,
        nested_caller
      };
    };
    return {
      dynamic_scoped_function,
      nested_function
    };
  };

  t = test();

  t.dynamic_scoped_function();

  t.nested_function().nested_caller();

}).call(this);

Результат при работе с node.js

variable function value: not in nested function
calling dynamic scoped function from nested...
variable function value: in nested function

Который, кажется, когда имя variable_function разрешено в dynamic_scoped_function, это зависит от стека вызовов, но статически не разрешается во внешний, как я ожидаю.

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

Спасибо за вашу помощь.

1 ответ

После того, как вы выполните nested_function, он назначает новую функцию vairable_function переменная [sic]. Переменная остается прежней, но теперь она содержит новое значение. Это имеет тот же эффект:

t.nested_function();          // replaces vairable_function
t.dynamic_scoped_function();  // accesses the redefined vairable_function

Или сильно упростил:

var foo = 'bar';
console.log(foo);
foo = 'baz';
console.log(foo);
Другие вопросы по тегам