第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

解釋封裝的匿名函數(shù)語法

解釋封裝的匿名函數(shù)語法

蝴蝶不菲 2019-06-01 16:03:15
解釋封裝的匿名函數(shù)語法摘要您能解釋一下用JavaScript封裝匿名函數(shù)的語法背后的原因嗎?為什么這樣做:(function(){})();但這并不是:function(){}();?我所知道的在JavaScript中,可以創(chuàng)建一個命名函數(shù),如下所示:function twoPlusTwo(){     alert(2 + 2);}twoPlusTwo();您還可以創(chuàng)建一個匿名函數(shù)并將其賦值給一個變量:var twoPlusTwo = function(){     alert(2 + 2);};twoPlusTwo();您可以通過創(chuàng)建匿名函數(shù)封裝代碼塊,然后將其封裝在括號中并立即執(zhí)行:(function(){     alert(2 + 2);})();在創(chuàng)建模塊化腳本時,這是非常有用的,以避免將當(dāng)前范圍或全局范圍與潛在沖突的變量混淆起來-比如Grecemonkey腳本、jQuery插件等等?,F(xiàn)在,我明白為什么要這樣做了。括號將內(nèi)容括起來,只公開結(jié)果(我確信有更好的方法來描述),例如(2 + 2) === 4.我不明白的是但我不明白為什么這也不一樣:function(){     alert(2 + 2);}();你能給我解釋一下嗎?
查看完整描述

3 回答

?
瀟湘沐

TA貢獻(xiàn)1816條經(jīng)驗 獲得超6個贊

它不起作用,因為它被解析為FunctionDeclaration,函數(shù)聲明的名稱標(biāo)識符是強制性.

當(dāng)您用圓括號包圍它時,它被計算為FunctionExpression,函數(shù)表達(dá)式可以命名也可以不命名。

a的語法FunctionDeclaration看起來是這樣的:

function Identifier ( FormalParameterListopt ) { FunctionBody }

FunctionExpressions:

function Identifieropt ( FormalParameterListopt ) { FunctionBody }

如你所見Identifier(標(biāo)識符)選擇)標(biāo)記FunctionExpression是可選的,因此我們可以有一個函數(shù)表達(dá)式,而不需要定義名稱:

(function () {
    alert(2 + 2);}());

命名功能表達(dá)式:

(function foo() {
    alert(2 + 2);}());

“家長”(正式名稱為分組操作符)只能環(huán)繞表達(dá)式,并計算函數(shù)表達(dá)式。

這兩個語法結(jié)果可能是模棱兩可的,它們看起來完全相同,例如:

function foo () {} // FunctionDeclaration0,function foo () {} // FunctionExpression

解析器知道它是否是FunctionDeclaration或者是FunctionExpression,取決于語境它出現(xiàn)的地方。

在上面的示例中,第二個表達(dá)式是一個表達(dá)式,因為準(zhǔn)算子也只能處理表達(dá)式。

另一方面,FunctionDeclarationS實際上只能出現(xiàn)在所謂的“Program“代碼,意思是全局作用域中的代碼,以及FunctionBody其他功能。

應(yīng)該避免塊內(nèi)的函數(shù),因為它們可能導(dǎo)致不可預(yù)測的行為,例如:

if (true) {

  function foo() {

    alert('true');

  }

} else {

  function foo() {

    alert('false!');

  }

}


foo(); // true? false? why?

上面的代碼實際上應(yīng)該產(chǎn)生一個SyntaxError,因為Block只能包含語句(ECMAScript規(guī)范不定義任何函數(shù)語句),但大多數(shù)實現(xiàn)都是容忍的,只需使用第二個函數(shù),即警報函數(shù)'false!'.

Mozilla實現(xiàn)-Rhino,SpiderMonkey-有著不同的行為。它們的語法包含非標(biāo)準(zhǔn)語句,意味著函數(shù)將在運行時間,而不是在解析時,就像在FunctionDeclarationS.在這些實現(xiàn)中,我們將定義第一個函數(shù)。


函數(shù)可以不同的方式聲明,比較以下幾點:

1-用功能構(gòu)造函數(shù)分配給變量倍增:

var multiply = new Function("x", "y", "return x * y;");

2-函數(shù)聲明名為倍增:

function multiply(x, y) {
    return x * y;}

3-分配給變量的函數(shù)表達(dá)式倍增:

var multiply = function (x, y) {
    return x * y;};

4-命名函數(shù)表達(dá)式漏斗名稱,分配給變量倍增:

var multiply = function func_name(x, y) {
    return x * y;};


查看完整回答
反對 回復(fù) 2019-06-01
?
汪汪一只貓

TA貢獻(xiàn)1898條經(jīng)驗 獲得超8個贊

盡管這是一個老生常談的問題和答案,但它討論了一個至今仍有許多開發(fā)人員需要一個循環(huán)的主題。我無法計算我采訪過的JavaScript開發(fā)人員中有多少人無法告訴我函數(shù)聲明和函數(shù)表達(dá)式之間的區(qū)別他不知道什么是立即調(diào)用的函數(shù)表達(dá)式。

不過,我想提一提,一個非常重要的事情是,即使Premasagar給出了一個名稱標(biāo)識符,它的代碼片段也不能工作。

function someName() {
    alert(2 + 2);}();

這不起作用的原因是JavaScript引擎將其解釋為一個函數(shù)聲明,后面跟著一個完全不相關(guān)的不包含表達(dá)式的分組運算符,以及分組運算符包含表達(dá)式。根據(jù)JavaScript,上面的代碼片段相當(dāng)于下面的代碼片段。

function someName() {
    alert(2 + 2);}();

我想指出的另一件事是,對于某些人來說,您為函數(shù)表達(dá)式提供的任何名稱標(biāo)識符在代碼上下文中都是無用的,除了函數(shù)定義本身之外。

var a = function b() {
    // do something};a(); // worksb(); // doesn't workvar c = function d() {
    window.setTimeout(d, 1000); // works};

當(dāng)然,在函數(shù)定義中使用名稱標(biāo)識符對于調(diào)試代碼總是有幫助的,但這完全是另外一回事.*-)


查看完整回答
反對 回復(fù) 2019-06-01
?
慕的地8271018

TA貢獻(xiàn)1796條經(jīng)驗 獲得超4個贊

偉大的答案已經(jīng)發(fā)布了。但我要指出的是,函數(shù)聲明返回一個空的完成記錄:

14.1.20-運行時語義:評估

職能宣言 : function Binding標(biāo)識符 ( Formalameters ) { 功能體 }

  1. 回歸

    NormalCompletion

    (空)

這個事實并不容易觀察,因為大多數(shù)嘗試獲取返回值的方法都會將函數(shù)聲明轉(zhuǎn)換為函數(shù)表達(dá)式。然而,eval顯示:

var r = eval("function f(){}");

console.log(r); // undefined

調(diào)用一個空的完成記錄是沒有意義的。怪不得function f(){}()不能工作。事實上,JS引擎甚至沒有嘗試調(diào)用它,括號被認(rèn)為是另一個語句的一部分。


但是,如果將函數(shù)包裝在括號中,它將成為一個函數(shù)表達(dá)式:


var r = eval("(function f(){})");

console.log(r); // function f(){}

函數(shù)表達(dá)式返回函數(shù)對象。因此你可以稱之為:(function f(){})().


查看完整回答
反對 回復(fù) 2019-06-01
  • 3 回答
  • 0 關(guān)注
  • 367 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號