- 函数声明语句和函数定义表达式有什么不同
首先看一下函数声明语句和函数定义表达式的例子,表达式会返回一个值,而语句就是js中的一整句,下面例子中第6行是函数声明语句,第10行是函数定义表达式。
f();//报错,提示没有定义这个函数
ff();//输出undefined,因为ff函数中的局部变量y声明提前,console.log中用到了y,js
//引擎通过作用域链解析y时,会在ff对象中找到局部变量y,这时候y声明提前但是赋值并未提前,
//故输出undefined
var y = 10;
function ff() { //函数声明语句
console.log(y);
var y = 20;
}
var f = function () {var x = 10; console.log(x);};//函数定义表达式
f();//输出10
不同点:
- 两种方式都创建了新的函数对象,但函数声明语句中的函数名是一个变量名,函数在声明时就将这个函数对象的值赋给了这个变量。在程序中ff就是一个变量名,在声明时就将函数对象的值赋给了ff,又因为声明会提前,故可以在还没有声明这个函数之前就调用它。程序中在第二行就调用了ff函数。
- 而函数定义表达式就不一样了,要想调用一个函数必须要能够引用它,在这里声明一个f变量确实是可以声明提前,但是我们知道赋值是不会提前的。所以在执行完 var f = function () {var x = 10; console.log(x);}; 这条语句之前,f是undefined的,故在第一行调用函数时会报错。在这条语句之后调用它就不会报错了。
- 函数声明语句并非真正的语句,ES规范知识允许它们作为顶级语句,它们可以出现在全局代码中,或者嵌套在其它函数中,但它们不能出现在循环,条件判断,或者try/catch/finally以及with语句中。但是函数定义表达式可以出现在程序中的任何地方。
- 和var语句一样,函数声明语句创建的变量也是无法删除的,但是这些值不是只读的是可以重写的。
更新中…
本人是个小白,如有错误欢迎指正…