從JavaScript的函數重名看其初始化方式

來源:互聯網
上載者:User

今天有個哥們問我要是JavaScript函數重名了會有什麼後果?開始我沒有細想,就說可能會出錯吧,可是等我實驗完了發現頁面沒有任何指令碼錯誤提示,而且程式也運行了,只是對同名函數的調用執行了位置靠後的一個。

回頭仔細一想,這個結果完全可以接受,因為指令碼在頁面裡本身就是順序執行下來的,包括函數的定義,但然如果只是定義 function foo(){} 這種形式,我們是跟蹤不到函數初始化的。可是如果是定義類的方式,我們就可以明顯地跟蹤到函數的初始化順序。比如:

function foo() {}
function foo.prototype.fn1() {}
function foo.prototype.fn2() {}

我們就可以明顯地看到先執行function foo.prototype.fn1(){}再執行function foo.prototype.fn2(){}。

回到我們剛才說的JavaScript指令碼函數重名問題上來,比如我們定義兩個函數 funAlert():

function funAlert()
{
alert('A');
}

function funAlert()
{
alert('B');
}

調用 funAlert(),那麼將顯示一個MegBox,內容為'B'。

為什麼初始化函數會有這樣的效果?這裡只用把上面兩個函數的定義改一下,就會一目瞭然了,我們把定義改為:

var fnAlert = new Function("alert('A')");
var fnAlert = new Function("alert('B')");

window.fnAlert();

其函數也就是定義在對象上的一個函數指標,我們象這個指標賦什麼函數引用,它就執行什麼效果,而JavaScript中的指令碼函數重名就和普通指派陳述式一樣,等同於:

var i = 0;
var i = 1;

// 稍微注意以下JavaScript裡的var,用var定義變數和我們平時用的進階語言定義變數是不同的,它只起到一個提示的作用,提醒說我在這裡定義變數了,而沒有什麼變數範圍的概念,只要不離開定義它的對象的域(比如頁面重新整理),出現過的變數會就一直存在。所以var寫不寫都行。舉個例子:

if ( true )
{
t = 100;
}
alert(t);

將顯示100,而

if ( true )
{
var t = 100;
}
alert(t);

也是顯示100。

所以JavaScript的指令碼函數名重不重複只是一個運算的問題,和我們進階語言裡的文法約束完全不是一回事,當然也更不是overload的範疇。

指令碼函數名重名有什麼用呢?最直觀就是可以用來實現偽重載,比如我們不少免費的首頁空間常常會給你強加快顯視窗廣告,我們就可以在頁面第一行寫上:

<script language="javascript">
var _open = window.open;
window.open = function() {}
</script>

這樣就可以屏蔽掉不是加在頁面第一行上的快顯視窗廣告(加在第一行不能攔截,因為window.open還沒有被'重載'open就先執行了)。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.