2014-12-13 111 views
0

我拉我的頭髮在這一個。我有兩個加載了wp_enqueue_scripts的單獨文件中定義的函數。在每個文件我換WordPress的jQuery功能

(function($){ 

})(jQuery); 

問題是,當我嘗試調用了在不同的文件,我得到「功能xxxx是沒有定義」中定義一個函數的功能我驗證了腳本在加載正確的順序並且沒有錯誤。我可以在同一個文件中調用該函數,但它工作正常,但是當我嘗試從不同的文件調用它時,它不會。是否有某種「命名空間」或我缺少的東西?

編輯: 我明白是怎麼回事...當我宣佈(函數($)內的功能...這是不是在全球範圍內如果我定義它我之外的功能。 。可以訪問它所以我的問題是我如何定義從(函數($)內,在全球範圍內的功能..

編輯2: OK我得到的東西的工作,我發現,如果我。聲明如下功能:

ShowForm = function(url){ 
    ... 
} 

而不是

function ShowForm(url){ 
    ... 
} 

它的工作原理。任何人都可以向我解釋爲什麼我必須這樣聲明函數嗎?是否有另一種方法來定義函數,使其在全局範圍內可用?

+0

看起來在第一種情況下,無論如何你必須看看_namespace_。 – Banzay 2014-12-13 20:22:39

回答

1

首先關閉你的jQuery代碼調用一個匿名函數,所以我們正在處理一個函數作用域,它會立即運行遇到。

(function(){.....}) //anonymous function syntax 

您在函數內創建的任何函數在函數外部都不可用。但是在這裏,我們錯誤地指的是函數......它實際上應該是「函數對象」而不是函數,並且在js中,您可以將對象分配給變量。

MyNewFunction = (function() {......}); // function object now assigned to variable MyNewFunction 

因此,在你的第二個例子中,這就是你在做什麼。

在函數對象中,您可以創建全局變量(即,您不重用已創建的全局變量)。如果在變量之前使用關鍵字var,則該變量將在範圍內位於本地。當你在一個函數中創建一個全局變量,並分配一個函數對象給它

aVariable = 'im global'; //global scope 

(function() { 
    MyVar= 'im global and can be called outside this function'; 
    var MyOtherVar= 'im not global and cannot be called outside this function'; 
    aVariable = 'change this'; 
}); 

console.log(MyVar); // global scope = 'im global and can be called outside this function' 
console.log(MyOtherVar); // local to above function only scope = undefined 
console.log(aVariable); // = global scope (unchanged scope) = 'change this' 

因此,函數對象現在可用的功能創造它已被稱爲後(在這種情況下,分析時)

(function() { 
    MyVar= function() {'alert function running'}; 
}); 

MyVar(); // works creates alert 

Theres以這種方式設置函數沒什麼問題,但是如果它們的目的是不加修改地使用(即函數不會根據其他內容進行更改),您可以通過在全局中聲明函數來提高代碼的可讀性首先是範圍。

+0

感謝David,除了將它們賦值給一個變量之外,還有更好的方法來聲明全局函數嗎? – 2014-12-15 22:23:52

+0

所有的函數對象在技術上都被賦值爲一個var(有點)'function foo()'和'foo'一起使用,'foo = function'也可以和foo()一起使用。但是,作爲先行。提到它更易於定義其他功能之外的功能。無論如何,任何變量都可以在表達式中進行控制。 – David 2014-12-15 23:09:16