<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