天天看點

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

回頭仔細一想,這個結果完全可以接受,因為腳本在頁面裡本身就是順序執行下來的,包括函數的定義,但然如果隻是定義 function foo(){}

這種形式,我們是跟蹤不到函數初始化的。可是如果是定義類的方式,我們就可以明顯地跟蹤到函數的初始化順序。比如:

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

function foo() {}

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

function foo.prototype.fn1() {}

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

function foo.prototype.fn2() {}

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

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

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

function funAlert()

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

{

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

    alert('A');

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

}

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

    alert('B');

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

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

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

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

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

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

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

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

window.fnAlert();

    其函數也就是定義在對象上的一個函數指針,我們象這個指針賦什麼函數引用,它就執行什麼效果,而JavaScript中的腳本函數重名就和普通指派語句一樣,等同于:

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

var i = 0;

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

var i = 1;

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

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

if ( true )

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

   t = 100;

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

alert(t);

    将顯示100,而

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

    var t = 100;

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

    也是顯示100。

    是以JavaScript的腳本函數名重不重複隻是一個運算的問題,和我們進階語言裡的文法限制完全不是一回事,當然也更不是overload的範疇。

    腳本函數名重名有什麼用呢?最直覺就是可以用來實作僞重載,比如我們不少免費的首頁空間常常會給你強加彈出視窗廣告,我們就可以在頁面第一行寫上:

<script language="javascript">

    var _open = window.open;

    window.open = function() {}

</script>

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

本文轉自部落格園鳥食軒的部落格,原文連結:http://www.cnblogs.com/birdshome/,如需轉載請自行聯系原部落客。

繼續閱讀