最近各大公司的實習招聘開始了,上學期的實習辭職到如今也快一個月了。這一月彷佛沒幹什麼似得,畢設開題也沒弄,被老闆抓着作實驗,各類鬧心的事。這月從新在看《JavaScript高級程序設計》,實習半年多都在作PHP,各類雜活,前端的知識原本就很差,更是忘了一大堆。筆試阿里的實習的時候,徹底傻眼了。。。仍是好好看看基礎知識吧。最近有關注各個實習的筆試題,都是看完了而後就忘了,想一想仍是記錄下來吧。爲即未來臨的找工做作作準備。javascript
首先第一種形式是咱們比較常見的,在閉包中咱們會常常用的。稱之爲自執行匿名函數,也就是說咱們建立了一個匿名函數,而後當即調用了它。前端
先來看一個函數定義和函數表達式的區別:java
函數定義:function FunctionName([.....]){FunctionBody}閉包
函數表達式:function [FunctionName]([....]){FunctionBody}函數
能夠看到這兩個形式很是的像,區別就是函數表達式能夠省略函數名。在JS中,若是一條語句是以function 開始,那麼就會被解釋爲函數定義,函數定義是不能緊跟着()被執行的。應該以下:this
var someFunction = function(){}; //定義函數設計
someFunction(); //調用函數blog
那麼咱們的匿名函數要怎樣定義後當即調用執行呢。這就是咱們見的第一種形式,在前面加個(function(){}),這裏就會將函數定義轉換成函數表達式,函數表達式就能夠後面跟着圓括號當即執行了。ip
好了,知道它的意思了,咱們就能夠很簡單的知道各個括號的用途了。作用域
function();這個括號是函數的參數列表。
(function(){});這個括號就是咱們說的將一個函數定義轉換爲函數表達式。
(function(){})();這個括號就是當即執行這個函數。由於JS沒有塊級做用域的概念,因此這個函數常常用來模仿塊級做用域。函數體內的變量在函數執行完以後會立馬被銷燬掉。看個例子:
function test(){ for(var i = 0; i < 10; ++i){ } alert(i);//10 }
function test(){ (function(){ for(var i = 0; i < 10; ++i){ } })(); alert(i);//Error:i is not defined! }
第二種寫法其實和第一種寫法最終效果是同樣的,也是自執行匿名函數。這種是模塊模式的寫法。
function add(a, b){ var temp = function(b){ return a + b; }; if(typeof b == "undefined"){ return temp; } else { return temp(b); } } console.log(add(2,5)); //7 console.log(add(2)(5)); //7