# :-: 匿名函數的特點
他就是ready();
1. 他叫做<span style="color:red;">立即運行</span>的匿名函數(也叫立即調用函數)
2. 當一個匿名函數<span style="color:red;">被括起來</span>,然后再在<span style="color:red;">后面加一個括號</span>,這個匿名函數<span style="color:red;">就能立即運行</span>起來!
3. 要使用一個函數,我們就得首<span style="color:red;">先聲明它的存在</span>。而我們最常用的方式就是使用function語句來定義一個函數
4. Function 對象
- Function對象是JavaScript里面的<span style="color:red;">固有對象</span>,所有的函數實際上都是一個Function對象。
- 我們先看看,<span style="color:red;">Function對象</span>能不能直接運用構造函數創建一個新的函數呢?答案是肯定的。
``` js
var abc = new Function("x","y","return x*y;");
alert(abc(2,3)); // "6"
```
5.匿名函數就是沒有名字,那么就引申到我們應該<span style="color:red;">如何去調用</span>他們的問題?
- 匿名函數的調用 ①
``` js
var abc=function(x,y){
return x+y;
}
alert(abc(2,3)); // "5"
```
上面的操作其實就等于<span style="color:red;">換個方式去定義函數</span>,這種用法是我們比較頻繁遇到的。
例如我們在設定一個DOM元素事件處理函數的時候,我們通常都不會為他們定名字,而是賦予它的對應事件引用一個匿名函數。
- 匿名函數的調用 ②
使用()將匿名函數括起來,然后后面再加一對小括號(包含參數列表)。
``` js
alert((new Function("x","y","return x*y;"))(2,3));// "6"
```
6.小括號的作用?
小括號能把我們的<span style="color:red;">表達式組合分塊</span>,并且每一塊,也就是每一對小括號,<span style="color:red;">都有一個返回值</span>。這個返回值實際上也就是小括號中<span style="color:red;">表達式</span>的返回值。
所以,當我們用一對小括號把匿名函數括起來的時候,實際上<span style="color:red;">小括號對返回的</span>,就是一個匿名函數的Function對象。
因此,小括號對加上匿名函數就如同有名字的函數般被我們取得它的<span style="color:red;">引用位置</span>了。所以如果在這個引用變量后面再加上參數列表,<span style="color:red;">就會實現普通函數</span>的調用形式。
7.函數聲明、函數表達式、匿名函數
函數聲明:function fnName () {…};使用function關鍵字聲明一個函數,再指定一個函數名,叫<span style="color:red;">函數聲明</span>。
函數表達式 var fnName = function () {…};使用function關鍵字聲明一個函數,但未給函數命名,最后將匿名函數<span style="color:red;">賦予一個變量</span>,叫函數表達式,這是最常見的函數表達式語法形式。
匿名函數:function () {}; 使用function關鍵字聲明一個函數,但未給函數命名,所以叫匿名函數,<span style="color:red;">匿名函數屬于函數表達式</span>。匿名函數有很多作用,<span style="color:red;">賦予一個變量</span>則創建函數,賦予<span style="color:red;">一個事件</span>則成為事件處理程序或創建閉包等等。
# :-: 函數聲明 和 函數表達式的 區別
一、Javascript引擎在解析javascript代碼時會‘函數聲明提升'(Function declaration Hoisting)<span style="color:red;">當前執行環境(作用域)上的函數聲明</span>,而函數表達式必須等到Javascirtp引擎執行到它所在行時,才會從上而下一行一行地解析函數表達式
二、<span style="color:blue;">函數表達式</span>后面可以加括號立即調用該函數,<span style="color:blue;">函數聲明</span>不可以,只能以fnName()形式調用
- 案例一:
``` js
fnName();
function fnName(){
...
}
//正常,因為‘提升'了函數聲明,函數調用可在函數聲明之前
fnName();
var fnName=function(){
...
}
//報錯,變量fnName還未保存對函數的引用,函數調用必須在函數表達式之后
```
- 例子二:
``` js
var fnName=function(){
alert('Hello World');
}();
//函數表達式后面加括號,當javascript引擎解析到此處時能立即調用函數
function fnName(){
alert('Hello World');
}();
//不會報錯,但是javascript引擎只解析函數聲明,忽略后面的括號,函數聲明不會被調用
function(){
console.log('Hello World');
}();
//語法錯誤,雖然匿名函數屬于函數表達式,但是未進行賦值操作,
//所以javascript引擎將開頭的function關鍵字當做函數聲明,報錯:要求需要一個函數名
```
要在函數體后面加括號就能立即調用,則這個函數必須是函數表達式,不能是函數聲明。
- 例子三:
``` js
(function(a){
console.log(a); //firebug輸出123,使用()運算符
})(123);
(function(a){
console.log(a); //firebug輸出1234,使用()運算符
}(1234));
!function(a){
console.log(a); //firebug輸出12345,使用!運算符
}(12345);
+function(a){
console.log(a); //firebug輸出123456,使用+運算符
}(123456);
-function(a){
console.log(a); //firebug輸出1234567,使用-運算符
}(1234567);
var fn=function(a){
console.log(a); //firebug輸出12345678,使用=運算符
}(12345678)
```
可以看到輸出結果,在function前面加!、+、 -甚至是逗號等都可以起到函數定義后<span style="color:red;">立即執行</span>的效果。而()、!、+、-、=等運算符,都將函數聲明<span style="color:red;">轉換成</span>函數表達式,消除了javascript引擎識別函數表達式和函數聲明的歧義。告訴javascript引擎這是一個函數表達式,不是函數聲明,可以在后面加括號,并立即執行函數的代碼。
<span style="color:red;">加括號是最安全的做法</span>,因為!、+、-等運算符還會和函數的返回值進行運算,有時造成不必要的麻煩。
# :-: 不過這樣的寫法有什么用呢?
javascript中<span style="color:red;">沒有私有作用域的概念</span>,如果在多人開發的項目上,你在全局或局部作用域中聲明了一些變量,可能會被其他人不小心用同名的變量給覆蓋掉,根據javascript函數作用域鏈的特性,可以使用這種技術可以<span style="color:red;">模仿一個私有作用域</span>,用匿名函數作為一個“容器”,“容器”內部可以訪問外部的變量,而外部環境不能訪問“容器”內部的變量,所以( function(){…} )()內部定義的變量不會和外部的變量發生沖突,<span style="color:red;">俗稱“匿名包裹器”或“命名空間”</span>。
JQuery使用的就是這種方法,將JQuery代碼包裹在( function (window,undefined){…jquery代碼…} (window)中,在全局作用域中調用JQuery代碼時,可以達到<span style="color:red;">保護JQuery內部變量</span>的作用。
- 雜談
- 開發 & 維護的工作流程
- 新手如何看php手冊 和 框架手冊
- 開發 & 維護的不同點
- 從0到1,搭建新項目的工作流程
- 從1到N,維護的工作流程
- 優化流程
- 生成錯誤日志和慢日志的方法
- 查錯思路
- 怎么快速接手一個項目
- 前端常用知識點
- javascript
- 自己封裝的函數
- 處理數字
- 功能代碼
- 動態添加圖片
- 判斷是手機端還是pc端
- javascript:;是什么意思?怎么用呢
- html & h5
- a標簽中target設置為blank和_blank有什么區別?
- 亂碼
- 提交方式:button標簽 和 input
- 塊元素
- 內聯元素
- h5特有屬性
- h5的localStorage【增、刪、改、查】
- jquery
- 常用方法
- 功能代碼
- 動態刪除圖片
- 一個按鈕,切換2種狀態
- 換膚
- 深入理解(function(){... })();
- json & xml
- json
- 語法速記
- json對象取值
- 字符串、對象、數組的區別
- xml
- [CDATA[%s]]的作用是什么
- 轉義字符
- CDATA 想被xml解析的文本數據
- CDATA 不想被xml解析的文本數據
- 微信小程序
- 其他
- websocket
- 跨域
- css
- 行內 & 內連 & 外連 寫法
- 優先級
- 更加精準的匹配
- 使用百分比如何生效
- php在html、js、jq中的的原生寫法
- *php在html中的語法
- php在js中的語法
- php在jq中的語法
- 正則表達式
- php常用基礎知識(思想為主)
- php為什么是“邊編譯邊運行”
- 冒號、endif、endwhile、endfor使用
- 遞歸思想(速記法)
- cookie和session的理解
- php常用內置(系統)函數
- 常量
- 字符串
- 數組
- 日期時間
- 文件 & 目錄
- 數學
- 程序執行
- 判斷
- 選項和信息(修改配置文件的)
- 錯誤處理 & 日志記錄
- 編碼格式
- session
- IP相關
- 類 & 對象
- 性能
- 其他函數
- 魔術方法
- $_SERVER
- 變量處理
- php自己封裝的一些函數
- 導入、導出、生成文件
- 數組
- 數字
- 字符串
- 其他
- 獲取linux硬件信息
- 常見插件/類庫使用
- 前端-框架/插件
- bootstrap 學習筆記
- layer 學習筆記
- layDate 學習筆記
- 百度ueditor1.4.4.3富文本編輯器
- quill富文本編輯器
- 百度ECharts圖形報表
- webuploader上傳圖片
- 后端類庫
- workerman 聊天室
- QRCODE 二維碼
- redis
- seaslog 日志
- phpspider 爬蟲
- Mailer 發送郵件
- simple_html_dom
- phpstorm使用
- 快捷鍵
- 連接mysql數據庫
- 斷點 + debug調試
- 運行內存不夠
- wamp環境
- yii、laravel、tp、開發自己的php框架
- 看框架源碼的思路
- tp5框架的使用
- 1、助手函數原理解析
- 開發自己的php框架
- 常用的開發思路 和 小功能實現代碼
- 爬蟲思路
- 功能點思路
- tp5判斷是不是異地登錄(簡單版)
- 微信開發,反向代理
- 微信開發,關閉當前頁面
- 消息隊列的實現
- 頁面靜態化
- session串號
- 站內信設計思路
- web在線管理器
- 語言相關(開發有關)
- 接收json(text/xml)格式數據
- 原生文件上傳(狀態碼)
- openssl擴展
- 打印對象 和 遍歷對象
- 使用OB緩存的幾個原則
- CLI模式執行php文件
- foreach時,添加元素 或 修改元素的值
- 功能點 代碼實現
- 生成url目錄樹(沒有pid)
- 多圖上傳(vue傳base64)
- 下載文件,耗時算法
- 生成商品二維碼
- 導出excel
- 搜索
- 阿里大魚發短信
- 使用阿里云oss
- location.href跳轉后,丟失用戶的session
- “\r ” “\r\n” “\t”的區別
- php的配置文件詳解
- 開啟錯誤日志
- 開啟慢日志
- 開啟短標簽
- 分析php-fpm.conf中的request_terminate_timeout參數