0

我有一个我没有编写的脚本已经在页面上运行。我想,在我编写的脚本,能够从原始脚本执行一个函数。这是我正在尝试做的一个简化示例:

(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'

但它显然有方法!我可以在那里看到它。我在这里做错了什么?

4

2 回答 2

1

您只能从插件函数的范围内访问该方法。它没有在全局范围内定义。

所以你不能调用那个函数。您在代码中所能做的就是调用函数,这些函数可通过调用函数的所谓作用域链获得。在您的情况下,这是在您的 function($){} 或全局范围内定义的所有内容。但插件中的功能两者都不是。

当您打电话时,$.fn.myExistingFunction.doMyThing您将 doMyThing 视为myExistingFunction对象中的一个字段。但实际上它是在函数内部定义的。也许这段代码更清楚:

$.fn.myExistingFunction = function (options) {
    var doMyThing = function(text) {
        alert(text);
    }
    var hi = "hello";
}

在 hi 和 doMyThing 中是 myExistingFunction 范围内的局部变量。如果插件的设计目的不是将功能公开给外部代码,则您无法访问变量。

一个旨在公开其内部功能的插件示例是jQuery UI 日期选择器文档)。它需要像 parseDate 和 formatDate 这样的函数,但是这些实用函数可能对一般开发也很有用,这就是为什么它们被显式地添加到 datepicker 对象中的原因。

于 2012-09-03T18:29:38.477 回答
0

我认为您的代码需要进行重大重写,因为它永远不会工作,实际上您不是function doMyThing的属性,它只是在其中声明,并且由于范围在 javascript 中的工作方式,您永远不会能够调用它。$.fn.myExistingFunction

于 2012-09-03T18:30:25.287 回答