先看下面2个例子
<script> fn(); var fn =function (){ alert("fn called"); } </script>
上面代码报错
求阶层一把使用
<script> function fn(n){ if(n<=1) return 1; return n*arguments.callee(n-1); } </script>
在EMCAscript第五版的静态模式中,callee被禁用
作用域
1.全局作用域
2.函数作用域
1.1.全局作用域 是函数之外(最外层代码)的作用域. 在函数之外进行声明的名称属于全局作用域,这里的名称就是所谓的
全局变量及全局函数
在函数内进行声明的名称拥有的函数作用域,又称局部作用域,作为函数形参的参数变量也属于局部函数作用域。
在javascript中函数作用域与进行声明的行数没有关系
<script> var x=1; function f(){ p("x="+x);//x=undefined var x=2; p("x="+x);//x=2 } f(); </script>
局部变量的作用域是整个函数f内部,由于此时还没有对其赋值,所以最开始读取的是undefined
其与下面代码等价
<script> function f(){ var x; p("x="+x); x=2; p("x="+x); } </script>
所以建议在函数的开始处对所有的局部变量进行声明
<script> var x=1; function f(){ p("x="+x);//x=1 } f(); </script>
块级作用域
js中不存在块级作用域
<script> var x=1; { var x=2; p("x="+x); //2 } p("x="+x);//2 //for语句中对循环变量进行声明是一种习惯做法 </script>
let与块级作用域
js随无块级作用域,let可实现同等效果
一.let定义(let声明)
二.let语句
三.let表达式
1.let定义
let var1[=value1] [,var2 [=value2] .........;