javascript中的函式式宣告與變數式宣告

2021-07-05 07:41:08 字數 1345 閱讀 1178

觀察下面兩段**,試寫出hello('word');的執行結果:

// 變數式宣告

function hello(msg);

alert(msg);

}//函式式宣告

function hello(msg);

alert(msg);

}對於變數式宣告,首先彈出word,然後彈出function,而函式式宣告,則兩次都是彈出function.這是為什麼呢?

一: 函式式宣告

function hello(msg)

alert(msg);//放在最末尾的位置列印msg,也是function

// 說明函式式宣告在hello作用域內部是貫穿的

}二:變數式宣告

function hello(msg)

alert(abc); // 此時才是function

// 這裡把abc換成msg,道理也是一樣的。對於hello內部來說,它的形參,就相當於是hello內部的區域性變數。

// 這裡有意用abc來替換msg,其實是為了簡化問題,減少干擾項。既然是都hello內的局域變數,那麼在宣告之前

// 它的值為undefined也就是理所當然的事了。這裡唯一有個要注意的地方就是,形參的宣告,出現在所有區域性變數之前。

// 後面對區域性變數進行重複宣告,

系統會直接無視重複的宣告過程,但是宣告同時有賦值的話除外。

}總結一點:函式式宣告會上公升到所屬作用域的最前面, 變數式宣告則不會.

最後補充一點:

var abc = function(){};

實際上是abc儲存了乙個無名函式的引用;本質上abc還是乙個變數.

而 function abc(){} 是乙個有名函式;本質上abc是函式;

var *** = abc; var bbb = abc;

引用可以無數,但是真身始終唯一。

// *** = null,bbb=null之後,abc該幹嘛幹嘛,而 var abc = function(){}; abc = null之後你就徹底的失去了有關abc的一切。

abc從此石沉大海,從江湖上隱姓埋名,銷聲匿跡.......

雖然兩者在功能上是等價的,但是呢,我個人還是蠻傾向於把子函式, 人為的寫在前面,這是為了避免壓縮合併時,造成各種意外的結果。

如果不是通用方法,我習慣用變數式宣告,當然,這只是個人習慣。

對於函式式宣告,它在整個作用域內可見,有的書上說是宣告提公升,有的說是宣告提前。其實叫什麼不重要,理解這種現象發生了什麼,會產生什麼影響才是根本。

最後還要強調一點:命名函式表示式的名字只在該函式的作用域內部有效。也就是說,在hello函式內,無論用哪種方式宣告msg這個函式,那麼出了hello函式,都是不存在的。

JavaScript中的函式

函式的宣告 方式一 js的 宣告區域和執行區域是一起的,都是在js 的 域中 function 函式名 形參名 1,形參名2 function test1 a1,a2 test1 1 2 方式二 根據底層都是物件,函式底層也都是物件 var 函式名 new function 形參1 形參2 函式體 ...

javascript函式式程式設計 遞迴函式

遞迴運算 使用尾遞迴可以避免遞迴的消耗記憶體的問題 遞迴是函式對自身的呼叫 遞迴的組成 遞迴呼叫 遞迴終止條件 if語句來進行控制 呼叫的形式 有直接呼叫 和 間接呼叫兩種方式 直接呼叫 若果在呼叫函式f 的過程中,又要呼叫f 間接呼叫 呼叫f1 的過程中又要呼叫f2 而在呼叫f2 的過程中又要呼叫...

javascript中的類式繼承

輔助函式,讓你可以將新函式繫結到物件的prototype上 為function.prototype增加乙個公有方法。所有由類的擴充的函式都可以使用它,它返回this,當我寫乙個不需要返回值的方法時,我通常讓它返回this,這顧慮到了串聯樣式 function.prototype.method nam...