我有一个我没写过的脚本已在页面上运行。我想,在做写的脚本中,能够从原始脚本执行一个函数。这是我正在尝试做的简化示例:
(function ($) {
$.fn.myExistingFunction = function (options) {
function doMyThing(text) {
alert(text);
}
}
}(jQuery));
jQuery(document).ready(function($) {
$.fn.myExistingFunction.doMyThing("alert text");
});
然而,当我运行它时,我得到控制台输出:
Uncaught TypeError: Object function (options) {
function doMyThing(text) {
alert(text);
}
} has no method 'doMyThing'
但它显然有方法!我可以在那里看到它。我在这里弄错了什么?
答案 0 :(得分:1)
您只能从插件功能的scope访问该方法。它没有在全球范围内定义。
所以你不能调用那个函数。您可以在代码中执行的所有调用函数都可以通过调用函数的scope chain来实现。在您的情况下,您可以在函数($){}或全局范围内定义所有内容。但插件中的功能都不是。
当您致电$.fn.myExistingFunction.doMyThing
时,您正在将doMyThing视为myExistingFunction
对象中的字段。但实际上它是在函数内部定义的。也许这段代码更清晰:
$.fn.myExistingFunction = function (options) {
var doMyThing = function(text) {
alert(text);
}
var hi = "hello";
}
在hi和doMyThing中是myExistingFunction范围内的局部变量。如果插件不是为了向外部代码公开功能而设计的,则无法访问变量。
设计用于公开其某些内部函数的插件示例是jQuery UI datepicker(documentation)。它需要parseDate和formatDate之类的函数,但这些实用函数也可能对一般开发有用,这就是为什么它们已经显式地添加到datepicker对象中。
答案 1 :(得分:0)
我认为你的代码需要重大改写,因为它永远不会有用,实际上你的function doMyThing
不是属于$.fn.myExistingFunction
的属性,它是简单地在其中声明,并且由于范围如何在javascript中工作,您将永远无法调用它。