2010-12-02 78 views
27

我有兩個外部.js文件。第一個包含一個功能。第二個調用該函數。從另一個.js文件調用javascript函數

file1.js

$(document).ready(function() { 

    function menuHoverStart(element, topshift, thumbchange) { 

     ... function here ... 

    } 

}); 

file2.js

$(document).ready(function() { 

    setTimeout(function() { menuHoverStart("#myDiv", "63px", "myIMG"); },2000); 

}); 

麻煩的是,這是不運行的功能。我需要兩個單獨的文件,因爲file2.js是根據特定條件動態插入的。如果我在file1.js末尾包含setTimeout ...行,此功能可以工作

任何想法?

+0

`menuHoverStart`是否在全局範圍內聲明? – 2010-12-02 12:45:04

+0

可能不是 - 我該怎麼做呢? – Tom 2010-12-02 12:48:03

回答

42

問題是,menuHoverStart無法在其範圍之外訪問(由文件#1中的.ready()回調函數定義)。您需要提供這方面的功能在全球範圍內(或通過任何對象可在全球範圍內):

function menuHoverStart(element, topshift, thumbchange) { 
    // ... 
} 

$(document).ready(function() { 
    // ... 
}); 

如果你想menuHoverStart留在.ready()回調,您需要將功能添加到手動(使用函數表達式)全局對象:

$(document).ready(function() { 
    window.menuHoverStart = function (element, topshift, thumbchange) { 
     // ... 
    }; 
    // ... 
}); 
4

您已經聲明menuHoverStart一個函數內部(匿名一個你傳遞給準備就緒)。這將其範圍限制爲該功能,並且不能從該功能以外調用它。

它不會什麼都有,因此在ready事件觸發之前不需要定義它,所以您可以將它移動到匿名函數之外。這就是說,全局變量值得避免,所以你可能更喜歡定義一個名稱空間(以減少名稱衝突的風險)並將該函數掛起。

var MYNAMESPACE = {}; // In the global scope, not in a function 
// The rest can go anywhere though 
MYNAMESPACE.menuHoverStart = function (element, topshift, thumbchange) { 
相關問題