<mark>语法一:函数声明</mark>
```js
// 声明
function funName() { //code }
// 调用
funName(); // 对于不需要传参的函数,也可以funName调用
```
<mark>语法2:函数表达式</mark>
```js
// 声明
var fn = function() { //code }
// 调用
fn();
```
**函数声明与函数表达式的区别**
* 函数声明必须有名字
* 函数声明会将函数提升,在预解析阶段就已创建,声明前后都可以调用
* 函数表达式类似于变量赋值
* 函数表达式可以没有名字,例如匿名函数
* 函数表达式没有变量提升,在执行阶段创建,必须在表达式执行之后才可以调用
<mark>语法3:自调用函数(匿名函数)</mark>
```js
(function(window, undefined) { //code })(window, undefined);
// 上面的两个参数:window参数可以根据需要换成其他参数,
// 但总是在最后保留undefined是为了防止undefined被重写,因为在低版本的浏览器中
// undefined是可以被重写的
```
我们可以将一个函数定义在自调用函数内部,来创建一个私有函数,
```js
(function() {
function myFun() { //code }
// 如果想要暴露myFun函数给外部进行调用,可以使用window对象
window.myFun = myFun;
}())
```
使用自调用函数需要注意如下问题:
```js
问题1:
// 如果存在多个自调用函数要用分号分割,否则语法错误
// 下面代码会报错
(function () {
}())
(function () {
}())
// 所以代码规范中会建议在自调用函数之前加上分号
// 下面代码没有问题
;(function () {
}())
;(function () {
}())
问题2:
// 当自调用函数 前面有函数声明时,会把自调用函数作为参数
// 所以建议自调用函数前,加上;
var a = function () {
alert('11');
}
(function () {
alert('22');
}())
```
- js应用场景
- js组成
- js书写位置
- 浮点数精度问题
- undefined与null的区别
- 数据类型转换
- 运算符优先级
- 代码调试
- 函数
- 函数的定义和调用
- 函数的return细节
- 函数是一种数据类型
- this的指向
- 函数成员
- 函数闭包
- 作用域
- 预解析
- js对象
- 对象的创建与调用
- new关键字
- this关键字
- 构造函数创建对象
- 事件
- 数据类型
- 继承
- 杂项
- 如何阻止标签的默认行为
- 为一个标签绑定或移除任何一个事件
- 如何阻止事件的冒泡行为
- 事件的三个阶段
- 移动元素的条件
- 匀速动画函数封装
- 变速动画函数封装
- 获取元素的css属性值
- 数据类型判断方法
- 创建对象的7种写法
- 如何继承
- 为js内置对象添加原型函数
- 将局部变量转换为全局变量
- call函数的用法
- 沙箱
- 浅拷贝
- 深拷贝
- 对象赋值会改变对象
- 解析URL中的字符串
- 格式化日期
- 获取当前浏览器类型
- Vue3.x
- 调式工具Vue Devtools