关于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 应该是指向函数名,因为函数名不能重写,不知道理解是否正确?

web前端开发 JavaScript

御坂19209 9 years, 6 months ago

 第一个函数:
(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()
})();

绿坝娘的祝福 answered 9 years, 6 months ago

Your Answer