Javascript中的奇怪行为,如动态作用域

Javascript中的奇怪行为,如动态作用域,javascript,scope,dynamic-scope,Javascript,Scope,Dynamic Scope,我有以下测试代码: //由CoffeeScript 2.2.3生成 (功能(){ var t,检验; 测试=函数(){ var动态范围函数、嵌套函数、可变函数; 动态范围的函数=函数(){ 返回console.log(`variable function value:${vairable_function()}`); }; 可值函数=函数(){ 返回“不在嵌套函数中”; }; 嵌套函数=函数(){ var-u调用方; 可值函数=函数(){ 返回“在嵌套函数中”; }; 嵌套的调用方=函数(){

我有以下测试代码:

//由CoffeeScript 2.2.3生成
(功能(){
var t,检验;
测试=函数(){
var动态范围函数、嵌套函数、可变函数;
动态范围的函数=函数(){
返回console.log(`variable function value:${vairable_function()}`);
};
可值函数=函数(){
返回“不在嵌套函数中”;
};
嵌套函数=函数(){
var-u调用方;
可值函数=函数(){
返回“在嵌套函数中”;
};
嵌套的调用方=函数(){
log(“从嵌套中调用动态作用域函数…”);
返回动态_作用域_函数();
};
返回{
可值函数,
嵌套调用方
};
};
返回{
动态作用域函数,
嵌套函数
};
};
t=测试();
t、 动态_作用域_函数();
t、 嵌套的_函数()。嵌套的_调用方();

}).打电话(这个)一旦执行
嵌套函数
,它将为
可变函数
[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);

这是一个复杂的代码,任何人都不应该写,但却做了我期望的事情…所以当你在一个块外定义了一个变量,并且你在该块内设置了值,它会得到该值时,你会感到惊讶吗?@Cow说,当你犯错误时,程序无法按预期工作。@如果您使用的linter要求定义和使用所有变量,或者使用
const
,则无法重新定义内容并会导致错误。这是使用
function funcname(){}
而不是
funcname=function(){}
的一个很好的理由