函数是JavaScript非常重要的一部分,它被称为第一等公民,可以看出它的地位是何等尊贵何等重要。根据我一贯的作风,会深入原理性的东西,那这篇文章主要来挖掘函数声明与函数表达式相关知识。
在JavaScript中定义一个函数有四种方式
-
<李>函数声明李>
<李>函数表达式李>
<李> ES6里箭头函数李>
<李>新功能()李>
函数声明
语法
<=坝镅詊avascript代码类>函数函数名(参数){ 要执行的代码 }代码>
调用
<李>函数名(参数)李> <李>函数名打电话给(函数名,参数)李> <李>函数名苹果(函数名,(参数])李> <李>新函数名(参数)李> <李>定时器李> <李>把函数声明变成函数表达式再调用李> <李> ES6里的模版字符串李>
引用><=坝镅詊avascript代码类>函数fn(文本){ console.log(文本); } fn(“直接调用的); fn.call (fn,用电话调用的); fn.apply (fn,['用应用调用的)); 新fn(用新调用'); setTimeout (fn(“用定时器调用')); (函数fn(文本){ console.log(文本); })(“转成函数表达式后调用的); fn的用模版字符串调用”;//ES6里语法 代码>函数表达式
语法
<=坝镅詊avascript代码类> var/我们/常量变量=function(参数){ 要执行的代码 }代码>调用
<李>函数名(参数)李> <李>函数名打电话给(函数名,参数)李> <李>函数名苹果(函数名,(参数])李> <李>新函数名(参数)李> <李>直接在后面加上一对小括号李> <李>定时器李> <李> ES6里的模版字符串李> <李>以被赋值的形式出现(根据具体形式调用)李>
引用><=坝镅詊avascript代码类> const fn=function(文本){ console.log(文本); }; fn(“直接调用的); fn.call (fn,用电话调用的); fn.apply (fn,['用应用调用的)); 新fn(用新调用'); const fn2=function(文本){ console.log(文本); }(“直接在后面加小括号调用的); setTimeout (fn(“用定时器调用')); fn的用模版字符串调用”; document.onclick=function () { console.log(“以被赋值的形式出现也是一个函数表达式”); };代码>函数声明与函数表达式的区别
<李>函数声明必须带有标识符(函数名称),函数表达式则可以省略
<李>表达式里的名字不能在函数外面用,只能在函数内部用李> <李>函数有一个名字属性,指向紧跟在函数关键字之后的那个函数名。如果函数表达式没有名字,那名属性指向变量名李> 李
> <李>函数声明会被预解析,函数表达式不会李><=坝镅詊avascript代码类>//1名字//函数声明必需带名字 函数fn () {};//函数(){};//报错,没有名字//函数表达式可以没有名字 让fn1=function () {}; (函数(){}); !函数(){};//表达式名字的作用 让fn2=函数newFn () { console.log (newFn);//可以在这里面用。有一个作用就是在这里用递归 }; fn2 ();//newFn ();//报错,不能在外面用//名字属性 console.log (//fn fn.name fn1.name,//fn1表达式没有名字,名字属性指向表达式变量名 fn2.name//newFn );//2、预解析 fn3 (); 函数fn3 () { console.log (“fn3”); }//fn4 ();//报错,不会被预解析 让fn4=function () { console.log (“fn4”); }代码>自执行函数
自执行函数也叫立即调用的函数表达式(IIFE)。它的作用为我们不用主动地去调用函数,它会自己调用,对于做模块化,处理组件是非常有用的。
首先来看一个问题,调用函数最简单的方法就是加一对小括号,那我在函数声明的末尾加一对括号后,这个函数能否调用呢?<=坝镅詊avascript代码类>函数fn () { console.log (1); }();//报错 const fn1=function () { console.log('表达式执行”); }();//执行函数代码>函数声明不能直接调用的原因
<李>小括号里只能放表达式,不能放语句李
函数声明与函数表达式