我正在为此抓狂。我在单独的文件中定义了函数,两个文件都加载了 wp_enqueue_scripts。在每个文件中,我将函数包装在
(function($){
})(jQuery);
问题是,当我尝试调用在不同文件中定义的一个函数时,我得到“函数 xxxx 未定义”,我验证了脚本是否以正确的顺序加载,并且没有错误。我可以在同一个文件中调用该函数并且它可以正常工作,但是当我尝试从不同的文件中调用它时却不能。是否有某种“命名空间”或我缺少的东西?
编辑: 我明白发生了什么事...当我在 (function($) 内部声明一个函数...它不在全局范围内。如果我在其外部定义该函数,我可以访问它。所以我的问题是如何我是否在 (function($).. 中定义全局范围内的函数?
编辑2: 好的,我有一些工作了。我发现我是否声明了如下函数:
ShowForm = function(url){
...
}
而不是
function ShowForm(url){
...
}
它有效。谁能向我解释为什么我必须以这种方式声明函数?是否有其他方法来定义该函数,以便它在全局范围内可用?
最佳答案
首先你的 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
以这种方式设置函数没有任何问题,但如果它们旨在不经修改而使用(即函数不会根据其他内容而改变),您可以通过在全局范围内声明函数来提高代码的可读性首先。
关于javascript - WordPress jQuery 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27462210/