0

私はそのようなコードを持っています:

var SEVERINU = SEVERINU || {};

SEVERINU.AutoGallery = {
    galleryImagesNames: new Array(),

    findImages: function () {
        var dirToResearch = this.galleryName;

        $.post(
            "_php/get-files.php", {
            dir: dirToResearch,
            ext: this.fileExtension
        }, function (data) {
            var pliki = $.parseJSON(data);
            console.log(data);
            for (var i in pliki) {
                this.galleryImagesNames.push(pliki[i]); // problem !
            }
        });

    },
}

この行:this.galleryImagesNames.push(pliki[i]);が問題を引き起こしています。

彼はvar galleryImagesNamesなどを見つけることができないと言います.

関数を呼び出す方法、「深い」場合の var は?

4

4 に答える 4

3

this関数内で上書きされないように、current を他の変数に保存するだけです。

var SEVERINU = SEVERINU || {};

SEVERINU.AutoGallery = {
  galleryImagesNames : new Array(),

  findImages : function(){
        var self = this; // keep current value of this in variable named self
        var dirToResearch = this.galleryName;

        $.post(
            "_php/get-files.php",
            {
                dir: dirToResearch,
                ext: this.fileExtension
            },
            function(data){
                var pliki = $.parseJSON(data);
                console.log(data);
                for(var i in pliki){
                    // call the method using self variable instead of this that got overwritten
                    self.galleryImagesNames.push(pliki[i]); 
                }
            }
        );

    },

}
于 2013-05-16T17:43:02.000 に答える
1

実際に$.postは、オブジェクトの残りの部分とは異なるスコープを持っているためです。これを試して:

findImages : function(){
    var dirToResearch = this.galleryName;
    var gImageNames = this.galleryImagesNames;
    $.post(
        "_php/get-files.php",
        {
            dir: dirToResearch,
            ext: this.fileExtension
        },
        function(data){
            var pliki = $.parseJSON(data);
            console.log(data);
            for(var i in pliki){
                gImageNames.push(pliki[i]); // we have access to this variable
            }
        }
    );

},
于 2013-05-16T17:43:14.397 に答える
1

無名関数の内部にいるため、thisキーワードを再度参照する必要があります。または、次のように直接使用します。

SEVERINU.AutoGallery.galleryImagesNames.push(pliki[i]);

通常、参照SEVERINU.AutoGalleryが複数回必要な場合は、次のような変数に保存することをお勧めします。

var that = SEVERINU.AutoGallery; // or "self" or something you prefer

for (var i in pliki) {
    that.galleryImagesNames.push(pliki[i]);
}

これは、オブジェクトの名前空間にアクセスするときに JavaScript が遅くなる傾向があるためです。奥に行くほど遅くなります。次/前のスコープにアクセスするには、関数スコープを最初に解決する必要があるため、参照が多いほど遅くなります。

于 2013-05-16T17:44:25.647 に答える
1

$.proxyを使用してコンテキストを渡すこともできます。

var SEVERINU = SEVERINU || {};

SEVERINU.AutoGallery = {
 galleryImagesNames : new Array(),

 findImages : function(){
    var dirToResearch = this.galleryName;

    $.post(
        "_php/get-files.php",
        {
            dir: dirToResearch,
            ext: this.fileExtension
        },
        $.proxy(function(data){ //Set up for the context to be passes for this function.
            var pliki = $.parseJSON(data);
            console.log(data);
            for(var i in pliki){
                this.galleryImagesNames.push(pliki[i]); // problem solved. now this doesn't refer to ajax context
            }
        },this) <-- Pass the context here
    );

},
}

$.proxy 関数を受け取り、常に特定のコンテキストを持つ新しい関数を返します。

于 2013-05-16T17:45:10.790 に答える