1. 什麼是自執行的匿名函式?
它是指形如這樣的函式: (function )();
2. 疑問
為什麼(function )();可以被執行, 而function ();卻會報錯?
3. 分析
(1). 首先, 要清楚兩者的區別:
(function )是表示式, function 是函式宣告.
(2). 其次, js"預編譯"的特點:
js在"預編譯"階段, 會解釋函式宣告, 但卻會忽略表式.
(3). 當js執行到function() ();時, 由於function() 在"預編譯"階段已經被解釋過, js會跳過function(), 試圖去執行();, 故會報錯;
當js執行到(function )();時, 由於(function )是表示式, js會去對它求解得到返回值, 由於返回值是一 個函式, 故而遇到();時, 便會被執行.
另外, 函式轉換為表示式的方法並不一定要靠分組操作符(),我們還可以用void操作符,~操作符,!操作符……
如:
!function()();
佚名函式()()
(())
(function() )();
(function(v)
)('hello');
(function() ());
(function(v)
('hello'));
有名函式()()
(())
(functionfn()
)();
(functionfn()
());
物件函式()()
物件函式(())
(}).init();
(}.init());
物件內部()
不可這樣呼叫
var foo =(1)}; alert(foo.fn);
//'yes'
var foo =(1)}; alert(foo.fn());
物件+","+函式+()
「物件」可以為如下,自己可試
1, function() ();
1、任意數字
2、特殊字元(!、~、- 、+)
3、void
4、true、false
當然這些也可以組合使用。
()應用,設計模式之單例模式
自定義物件
//()應用
var singleton = (function
() };
}return
};})();
/*呼叫公有的方法來獲取例項:
*/singleton.getinstance().publicmethod();
var obj ={};(function
(q)
} (obj)); //提交obj全域性物件
obj.publish('hello');//hello
(function(a)
} (window));
//window物件
publish('hello');
著名應用例項:jquery
設計模式之迭代器模式
(function() ;
jquery.fn = jquery.prototype =,
jquery: "1.7.1"};
//合併 init()的屬性為jquery.fn
jquery.fn.init.prototype =jquery.fn;
//返回jquery
return
jquery
})();
//定義jquery全域性物件
window.jquery = window.$ =jquery;
})(window);
//應用例項
alert($().jquery);//
1.7.1
var fn = (function() ,
current:
function
() };
} ());
alert(fn.current());
根據引數選擇執行物件
var fn=(function()(),
i2:function
()()
};//json格式,可以無序排列
var json=;
//array陣列,有序排列
//var ar=["i11","i12"];
return
};})();
alert(fn.init(1));
return ; //為傳進來的物件新增屬性
x.on = c; //為傳進來的物件新增方法
x.dm = g; //為傳進來的物件新增方法
return x
}}
使用閉包:
(function
($) )(jquery);
這是來自jquery官方的外掛程式開發規範要求,使用這種編寫方式有什麼好處呢?
a) 避免全域性依賴。
b) 避免第三方破壞。
c) 相容jquery操作符'$'和'jquery '
我們知道這段**在被解析時會形同如下**:
varjq
=function
($) ;
jq(jquery);
利用匿名函式繫結事件
var obj = document.getelementbyid("psd");
obj.οnclick=(function()
})()
1.佚名函式
function()
2.分組正則呼叫佚名函式
(function() )();
3.定時呼叫佚名函式
settimeout(function();
}());
5.給佚名函式傳弟引數,等價4
(function( bird ) ;
}( window.bird = window.bird || {} ));
JavaScript 立即執行函式
函式轉為表示式,會被立即執行。再次訪問函式名返回空 下面2個括弧 都會立即執行 function 推薦使用這個 function 但是這個也是可以用的 由於括弧 和js的 異或,逗號等操作符是在函式表示式和函式宣告上消除歧義的 所以一旦解析器知道其中乙個已經是表示式了,其它的也都預設為表示式了 va...
立即呼叫函式(IIFE
定義 iife 立即呼叫的函式表示式,宣告函式的同時立即呼叫這個函式。語法 iife的常用寫法 這兩種寫法的作用相同,只是表現形式不同而已,只是起了自執行的作用 function 把函式當作表示式解析,然後執行解析後的函式 相當於 var a function a a得到的是函式 function ...
Javascript之立即執行函式和逗號操作符
定義 此類函式沒有宣告,在一次執行過後即釋放。適合做初始化工作。function 只有表示式才能被執行符號執行 function test 錯,函式宣告不能被執行 function test 可以執行 function test a,b,c 1,2,3 既不報錯也不執行,會被理解成function ...