JavaScript函数作用域行为

JavaScript函数作用域行为,javascript,function,scope,expression,declaration,Javascript,Function,Scope,Expression,Declaration,我无法解释JS的奇怪行为,希望有人能帮我。 考虑下面的代码: 'use strict'; // no error function f1(n){ (function a(k){ a = 5; console.log(a); if(k<n) a(++k); })(1); } // error!! function f2(n){ function a(k){ a = 5;

我无法解释JS的奇怪行为,希望有人能帮我。 考虑下面的代码:

'use strict';

// no error
function f1(n){
    (function a(k){
        a = 5;
        console.log(a);
        if(k<n)
            a(++k);
    })(1);
}

// error!!
function f2(n){
    function a(k){
        a = 5;
        console.log(a);
        if(k<n)
            a(++k);
    };
    a(1);
}

//no error
function f3(n){
    var a = function a(k){
        a = 5;
        console.log(a);
        if(k<n)
        a(++k);
    };
    a(1);
}
“严格使用”;
//无误
函数f1(n){
(职能a(k){
a=5;
控制台日志(a);
if(使用匿名函数保留全局变量的值

函数异步函数(回调){
setTimeout(回调,200);
}
var color='蓝色';
(功能(颜色){
异步函数(函数(){
log(`this is color:${color}`);
})
})(颜色);
控制台。日志(颜色);

color='green'
我一直在想为什么人们会试图解释这种可怕的编码实践。真正的答案是永远不要这样做。如果不能立即清楚地知道它是如何工作的以及为什么会这样工作的,那么这可能不是一种易于理解、可维护或万无一失的编码方式。我不会在实际的代码中做奇怪的事情。但它确实存在玩弄你不懂的东西是个好主意,以防将来你不小心编写了不可靠的代码。我想我从来没有提到过这段代码在生产中使用过,也不确定。我只是玩弄JS scope功能来更好地理解它到底是如何工作的。这都是出于好奇,而不是真正的问题。我知道pe这类问题是允许的,不是吗?@jfriend00不是所有的问题都是关于伟大的实践的,也不应该是。有些问题是关于知识的,出于乐趣、科学或纯粹的好奇心。顺便说一下,如果有人感兴趣,这里有一些解释