Странное поведение, такое как динамическое копирование в 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);