我正在把头发拉过来。我有在单独的文件中定义的函数,均已加载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/