2014-10-07 58 views
1

我有一個頁面,它在其本身的頂部加載一個文件,其中包含我的大部分JQuery函數。加載超出範圍的函數

左右的時間內該文件是例如: -

$().ready(function() { 
    function foo(){ 
    doSomething; 
    } 
} 

現在,在那個特定的頁面我想用以前加載的文件的功能之一的結束。

當我打電話給foo();它說我得到foo is not defined,我的問題是我可以調用該函數嗎?如果是的話如何?

我也試過:

window.onload = function(e){ 
    foo(); 
} 

但同樣的錯誤

+0

如果加載的文件之前有'foo'聲明 - 它應該是可訪問的。 – tymeJV 2014-10-07 19:14:19

+1

你必須讓某些全局命名空間的'foo'部分。或者查看模塊和Browserify,從長遠來看它會爲您節省一些時間。 – elclanrs 2014-10-07 19:15:21

+0

您可能試圖在釋放'.ready'之前調用函數 – Brennan 2014-10-07 19:15:40

回答

1

這裏的問題是,你正在聲明傳遞給就緒jQuery方法的匿名函數範圍內的函數。

$().ready(function() { 
    function foo(){ 
    doSomething; 
    } 
// foo can only be accessed on this scope. 
}); 

您可以使用窗口變量將該函數暴露給窗口範圍。

$().ready(function() { 
    window.foo = function foo(){ 
    doSomething; 
    } 
// foo can be accessed on this scope and on the gloabl app scope. 
}); 
+0

非常感謝,這是一種向我展示範圍並完美運作的新方式。 – 2014-10-07 19:26:18

+0

,但是在全局聲明'foo'方面,_no並沒有什麼優勢。它也遭受'window.foo'在'$()。ready'後面定義的缺點 – Alnitak 2014-10-07 19:34:11

+0

是的,這是正確的。但這是他的問題的答案。真的,我不知道他爲什麼需要這種行爲,但是解決方案。 – chfumero 2014-10-07 19:38:42

2

聲明它在全球範圍內。

var foofn; 
$().ready(function() { 
    foofn = function(){ 
    doSomething; 
    } 
}) 
+0

或 - _只是將整個定義移到外面! – Alnitak 2014-10-07 19:36:59

+0

我同意,只是試圖教導提問者這個**如何被拉取,而不是討論它是否是正確的方法(我同意它不是在大多數情況下)。 – hakazvaka 2014-10-07 19:41:24

1

您必須在全球範圍內定義foo。而不是function foo(){}嘗試window.foo = function(){}

比在對象上粘貼一堆屬性稍微不那麼草率的方法是定義一個放置東西的全局對象,

var myApp = {}; 

$(document).ready(){ 
    myApp.foo = function(){ doSomething; } 
} 

這種方式,在同一頁上後執行腳本將不得不myApp.foo訪問。

+1

它不是「稍後在同一頁面上」的腳本,它是DOM ready ready event_後的_腳本。之間調用的任何內容都會失敗,因爲'myApp.foo'將會是'undefined'。 – Alnitak 2014-10-07 19:33:25

1

如果(這是一個很大的)foo需要在全局範圍內調用,那麼只需在全局範圍內聲明它 - 沒有一點作爲$().ready的內部函數隱藏它,如果這不是它將被使用的地方。

如果你想避免全球污染,包住整個事情在立即調用函數表達式

(function() { 

    // called when all resources are loaded 
    window.onload = function foo() { 
     ... 
    }; 

    // called when the DOM is ready 
    $().ready(function() { 
     ... 
    }); 

})(); // invoke now