关于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
应该是指向函数名,因为函数名不能重写,不知道理解是否正确?
御坂19209
9 years, 6 months ago
Answers
第一个函数:
(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