先看下下面幾種寫法

1.function f(x){return x*x;};f(x);

2.(function(x){return x*x;})(x);

3.(function(x){return x*x;}(x));

第一種我們應(yīng)該都很熟悉了,這是 " /> 国产在线观看成人,国产精品一区第二页,久久99热这里只频精品6

天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

(轉(zhuǎn)載)JavaScript中匿名函數(shù),函數(shù)直接量和閉包

原文出處: http://www.dnew.cn/post/196.htm

先看下下面幾種寫法

1.function f(x){return x*x;};f(x);

2.(function(x){return x*x;})(x);

3.(function(x){return x*x;}(x));

第一種我們應(yīng)該都很熟悉了,這是我們經(jīng)常使用的寫法。第二第三種都是匿名函數(shù)的寫法。

--------------------------------------------------------------------------------

第二種
可以這樣理解:

var f=function(x) {return x*x;};f()

那我們不通過(guò)f這個(gè)變量來(lái)引用函數(shù)就是

function(){}()

然而這樣肯定是錯(cuò)誤的就像

var f=1+2;
f=f*0;



var f=1+2*0;


結(jié)果不同一樣。
要得到正確結(jié)果只能:

f=(1+2)*0;

也就是要明確的標(biāo)識(shí)出程序塊,即:

(function(){})()


肯你有疑問(wèn):括號(hào)“()”到底是不是起到了標(biāo)識(shí)代碼塊的作用?
我們可以用JavaScript的內(nèi)置函數(shù)檢測(cè)一下!
舉一個(gè)最簡(jiǎn)單的例子:

alert(4)

這段代碼會(huì)彈出提示內(nèi)容是“4”
改成這樣
(alert)(4)

可以看到執(zhí)行的效果和上一段代碼一樣。

這種形式的函數(shù)執(zhí)行也被很多JavaScript框架所采用。

--------------------------------------------------------------------------------

第三種,如果你用過(guò)jsvm框架的話就會(huì)發(fā)現(xiàn)里面的代碼使用了這種形式。
那如何解釋第三種情況呢?
為了弄明白瀏覽器是如何理解這樣的寫法的,我們可以利用一下Mozilla Firefox的錯(cuò)誤控制臺(tái)功能。
在代碼中插入一段錯(cuò)誤代碼,代碼段如下:

(function(s){s+s}(1)).splice();

打開(kāi)Mozilla Firefox的錯(cuò)誤控制臺(tái),可以看到有如下的錯(cuò)誤提示

錯(cuò)誤: (function (s) {})(1) has no properties
源文件:file:///C:/Documents…….html
行:18

可以認(rèn)為,瀏覽器對(duì)于
(function(s){s+s}(1))
這樣的代碼按照

(function (s) {s+s})(1)
來(lái)解析的。


--------------------------------------------------------------------------------

到此可能你有這樣的認(rèn)識(shí):

function f(x){return x*x;};f(x);==(function(x){return x*x;})(x);==(function(x){return x*x;}(x));


但是他們還是有區(qū)別的,
首先,對(duì)于像第二和第三種形式,其它的函數(shù)和代碼是不可能調(diào)用所定義的函數(shù)的,有一種說(shuō)發(fā)把這樣的函數(shù)稱為匿名函數(shù)或者函數(shù)直接量。
其次,第二和第三種形式執(zhí)行的函數(shù),中間變量不會(huì)污染到全局命名空間,你可以把中間的代碼看作純粹的子過(guò)程調(diào)用。
當(dāng)然使用后面兩種形式的函數(shù)定義可以很容易的實(shí)現(xiàn)閉包。
看一個(gè)例子:

/*
http://jibbering.com/faq/faq_notes/closures.html(Dnew.CN注)
A global variable - getImgInPositionedDivHtml - is declared and
  assigned the value of an inner function expression returned from
  a one-time call to an outer function expression.

  That inner function returns a string of HTML that represents an
  absolutely positioned DIV wrapped round an IMG element, such that
  all of the variable attribute values are provided as parameters
  to the function call:-
*/
var getImgInPositionedDivHtml = (function(){
   /* The - buffAr - Array is assigned to a local variable of the
      outer function expression. It is only created once and that one
      instance of the array is available to the inner function so that
      it can be used on each execution of that inner function.

      Empty strings are used as placeholders for the date that is to
      be inserted into the Array by the inner function:-
   */
   var buffAr = [
       '<div id="',
       '',   //index 1, DIV ID attribute
       '" style="position:absolute;top:',
       '',   //index 3, DIV top position
       'px;left:',
       '',   //index 5, DIV left position
       'px;width:',
       '',   //index 7, DIV width
       'px;height:',
       '',   //index 9, DIV height
       'px;overflow:hidden;/"><img src=/"',
       '',   //index 11, IMG URL
       '/" width=/"',
       '',   //index 13, IMG width
       '/" height=/"',
       '',   //index 15, IMG height
       '/" alt=/"',
       '',   //index 17, IMG alt text
       '/"><//div>'
   ];
   /* Return the inner function object that is the result of the
      evaluation of a function expression. It is this inner function
      object that will be executed on each call to -
      getImgInPositionedDivHtml( ... ) -:-
   */
   return (function(url, id, width, height, top, left, altText){
       /* Assign the various parameters to the corresponding
          locations in the buffer array:-
       */
       buffAr[1] = id;
       buffAr[3] = top;
       buffAr[5] = left;
       buffAr[13] = (buffAr[7] = width);
       buffAr[15] = (buffAr[9] = height);
       buffAr[11] = url;
       buffAr[17] = altText;
       /* Return the string created by joining each element in the
          array using an empty string (which is the same as just
          joining the elements together):-
       */
       return buffAr.join('');
   }); //:End of inner function expression.
})();
/*^^- :The inline execution of the outer function expression. */

JavaScript技術(shù)(轉(zhuǎn)載)JavaScript中匿名函數(shù),函數(shù)直接量和閉包,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 单亲妈妈3韩国电影免费观看 | 国产精品成久久久久三级四虎 | 高h肉文np| 九九热久久只有精品2 | 亚洲 日韩 国产 制服 在线 | 亚洲午夜精品aaa级久久久久 | 美女张开让男生桶 | 国内精品久久久久影院亚洲 | 无码人妻精品国产婷婷 | 无码爽死成人777在线观看网站 | 高h np 强j 乱l 双性 | 色综合伊人色综合网站下载 | 又黄又粗又爽免费观看 | 琪琪电影午夜理论片77网 | 日日做夜夜欢狠狠免费软件 | u15女少天堂写真 | 欧美日韩亚洲成人 | 日日摸夜添夜夜夜添高潮 | 菠萝菠萝蜜视频在线看1 | 世界上第一个得抑郁症的人是谁 | 免费看大黄高清网站视频在线 | jzz大全18 | 国产精品久久久久激情影院 | 果冻传媒视频在线观看完整版免费 | 久久亚洲精品AV无码四区 | 麻豆国产自制在线观看 | 果冻传媒2021一二三在线观看 | 亚洲AV无码一区二区三区牛牛 | 国产在线观看99 | 色婷婷五月综合中文字幕 | avove主播| 果冻传媒在线观看进入窗口 | 亚洲国产第一 | 国产成人精品视频免费大全 | 德国黄色录像 | 99国产精品偷窥熟女精品视频 | 久久综合九色 | 久草在线一免费新视频 | 公和我做好爽添厨房中文字幕 | 国产婷婷一区二区在线观看 | 熟妇少妇任你躁在线无码 |