<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<p>我在哪 是谁 是 </p>
<script type="text/javascript">
var f1 = (function f(num){
console.log(f,'---');
f=null;
console.log(f)//f的值没变 相当于configurable设置为了false变成了个常量
if(num<=1){
return 1
}
return num*f(num-1)
})//这里的括号加不与不加结果一样
f1(1);//这里执行函数内部可以访问到f变量
f(1)//这里执行报错 Uncaught ReferenceError: f is not defined
</script>
</body>
</html>
为什么f会变成局部变量了 而不是全局 f的值为什么不能设置了呢
/* 有名函数 */
function b() {
//函数体
}
/* 匿名函数 */
var a = function () {
//函数体
}
一般的函数定义分为有名函数和匿名函数,二者区别在var上的作用域提升。
看题主的写法,是混用了两种定义方式,js引擎在检测到有名函数时便会而外创建一个Window对象上的属性b来指向所写的有名函数的函数名,而匿名函数则是创建用户所指定的变量名a。但当两种命名都存在时,我认为计算机检测到了var a之后便直接创建函数指向Window.a,而不再创建额外的变量Window.b。类似于自调用函数在内部可以通过函数名调用,而外部则访问不到函数。
以上为Window对象的部分截图,我们可以看到Window对象上存在属性f1,函数的名字f还是存在的。但是没有额外创建Window对象的属性f。
这是我的理解,希望可以给你提供到一点思路上的帮助。