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 datepickerドキュメント)です。parseDateやformatDateなどの関数が相互に必要ですが、これらのユーティリティ関数は一般的な開発にも役立つ可能性が高いため、datepickerオブジェクトに明示的に追加されています。

于 2012-09-03T18:29:38.477 に答える
0

コードを大幅に書き直す必要があると思います。これは、コードが機能しないためです。実際、コードはのプロパティでfunction doMyThingなく$.fn.myExistingFunction、コード内で宣言されているだけです。スコープがjavascriptでどのように機能するかにより、コードは機能しません。それを呼び出すことができます。

于 2012-09-03T18:30:25.287 に答える