在我自己的脚本中从包含的Javascript文件中调用函数

时间:2012-09-03 18:26:37

标签: javascript jquery function

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

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

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

2 个答案:

答案 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 datepickerdocumentation)。它需要parseDate和formatDate之类的函数,但这些实用函数也可能对一般开发有用,这就是为什么它们已经显式地添加到datepicker对象中。

答案 1 :(得分:0)

我认为你的代码需要重大改写,因为它永远不会有用,实际上你的function doMyThing 不是属于$.fn.myExistingFunction的属性,它是简单地在其中声明,并且由于范围如何在javascript中工作,您将永远无法调用它。