关于js的命名函数表达式的疑惑

(function() {
    var f = function f(f) {
        console.log(f);// 2
        f = 1;
        console.log(f);// 1
    }
    f(2);
    console.log(f);// function f(f)
})();
(function() {
    var f = function f() {
        console.log(f);// function f()
        f = 1;
        console.log(f);// function f()
    }
    f();
    console.log(f);// function f()
})();

我的理解是在同一作用域中形参优先级比同名函数名高,在函数体修改f只修改了arguments对象,第二个case中f应该是指向函数名,因为函数名不能重写,不知道理解是否正确?

阅读 2.5k
2 个回答
第一个函数:
(function() {
    var f = function f(f) {
        console.log(f);// 2 ->此处的输出是你调用函数时实参传入的 2;
        f = 1;
        console.log(f);// 1 ->此处的输出是你在函数体内改变的形参值 1;
    }
    f(2);
    console.log(f);// function f(f) ->此处的输出是你为var f 变量的赋值 f(f);
})();

第二个函数:
(function() {
    var f = function f() {
        console.log(f);// function f() ->此处的输出为var f变量的值 f();
        f = 1;
        console.log(f);// function f() ->此处的输出同上,解释:f()函数里面的f=1因为没有添加 var,其实是声明了一个window下的全局变量,获取的时候会采取就近原则,如果闭包作用域下找不到才会去全局作用域下查找;
    }
    f();
    console.log(f);// function f()
})();
新手上路,请多包涵
 var f = function f() {
        console.log(f);// function f() ->此处的输出为var f变量的值 f();
        f = 1;
        console.log(f);// function f() ->如果不写立即执行函数封装也会得到一样的结果,那就是命名函数内部改不了命名函数的引用(命名,名字当然不能改的呀,名字改不了,引用也改不了)
    }
    f();
    console.log(f);// function f()
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题