經常用,今天總結一下,下文摘自某網友的總結:
(function($){...})(jQuery)實際上是匿名函數,不懂得朋友可以繼續往下看。
這里實際上是匿名函數 function(arg){...} 這就定義了一個匿名函數,參數為arg 而調用函數時,是在函數后面寫上括號和實參的,由於操作符的優先級,函數本身也需要用括號,即: (function(arg){...})(param) 這就相當於定義了一個參數為arg的匿名函數,並且將param作為參數來調用這個匿名函數 而(function($){...})(jQuery)則是一樣的,之所以只在形參使用$,是為了不與其他庫沖突,所以實參用jQuery var fn = function($){....}; fn(jQuery);
(funtion(){})();立即執行函數;相當於先申明一個函數,聲明完后直接調用;如果參數如:
(funtion(str){alert(str)})("output"));相當於:funtion OutPutFun(str){alert(str);};OutPutFun("output");
最近在整理
javascript
學習,發現這個問題了
,在網上發現這么個解釋
最清
楚
最明白
;
(function(){})()
相當於先定義
function xx(){}
,后調用
xx();
()
是最高優先級的,所以先執行
function(){}
,
這個定義了一個匿名函數,等於
xx=function(){}
接着就是調用
xx()
了
;
給個例子
JScript code
functionf1(a)
{
alert(a);
}
functionf2(a)
{
returnfunction(){
alert(a);
}
}
這里的
var x=f2
就等於把函數傳遞給了
f2,
然后要執行這個函數
,
就必須加
()
也就是
x();
也就是
f2()
還是
(function f2(a){
return function(){
alert(a);
})();
另外還有一個問題
就是命名空間的問題
YY = YY||{};---
聲明一個叫
YY
的命名空間(定義一個全局的變量)
(function() {
YY.Lang=function()
{------
聲明一個叫
YY.Lang
的命名空間
(通過全局變量的
增加屬性的方式把閉包里的對象傳到全局變量中,實現代碼封裝的效果)
isUndefined: function(o) {
return typeof o === 'undefined';
},
isString: function(o) {
return typeof o === 'string';
}
};
})();
---
調用方法
alert(YY.Lang.isString('test me'));
這時候就有人不明了,
樓上為什么要加
(function()
{
和
)();
最外面的這兩行,
有什么用啊?
J
Script code
YY=YY||{};
//---
聲明一個叫
YY
的命名空間(定義一個全局的變量)
//(
function()
{
YY.Lang=function()
{
//------
聲明一個叫
YY.Lang
的命名空間
(通過全局變量的增加屬性的方式把閉包里的對象傳
到全局變量中,實現代碼封裝的效果)
isUndefined:function(o)
{returntypeofo==='undefi
ned';
},
isString:function(o)
{returntypeofo==='string';
}
};
}
//)();
//---
調用方法
alert(YY.Lang.isString('test
me'));
疑問在這:??????
注釋掉這兩行有什么不一樣的呢?不就是申明嗎,為什么要用
()()執行一下啊?
答:
(
function(){})()
意思是立即執行前一個括號里的
function
,相當於是一個匿名函數
;
由於里面
的代碼的執行,
定義了
YY.Lang
這個對象,
所以可以執行
alert(YY.Lang.isString('test
me'));
調用
isString
方法。
但是,如果按照你寫的
functionaa(){..};//
只是定義了一個叫
aa的函數,但是並沒有執行
alert(YY.Lang.isString('test
me'));//
執行的時候會報找不到
isString
的方法。
這么寫有什么好處??????????????
(function{})()
的寫法有個好處,就是能很好的利用
javascript
的變量的可見范圍為執行腳本
時節省空間。例如以下寫法
1和寫法2達到的目的是一樣的,但是寫法1的由於a變量的
可見范圍只是在匿名函數體內,
所以a
在執行完這個匿名函數后就釋放空間了。
但是寫法2
會一直存在該頁面中。
寫法
1
:
JScript
code
(function(){vara=2;
alert(a);
})();
寫法
2
:
JScript
code
vara=2;
alert(a);