1

次のコードがあります。

var dp = dp || {
    VERSION : '0.00.02',
    startApp : function() {
        $(app.init);
        $(app.start);
    }
};
dp.startApp();

以下の app.init と app.start を呼び出します。

var app = app || {};

app.init = function() {
    this.baseElement = $('div#app');
    $('body').css('background-color', 'beige');
};

app.start = function() {
    //this.baseElement.html('showing this'); //this works
    //this.show(); //error: show is not a function
    app.show(); //error: show is a function, but baseElement is undefined
};

app.show = function() {
    this.baseElement.html('showing this');
};

なぜapp.startですか:

  • 最初のライン作業
  • 2行目はそれが関数ではないことを示しています
  • 3 行目は baseelement が定義されていないと言っています
4

3 に答える 3

4

関数を に渡しているためdocument.ready、jQuery はthisset toで関数を呼び出しますdocument。つまりdocument、もちろん任意のプロパティを設定できますが、jQuery オブジェクトではないため、呼び出しているメソッドがありません。

これを試すことができます:

$(dp.startApp) //Since `this` doesn't matter here

startApp : function() {
    app.init(); //Calling the functions as property of `app`, will make `this` set to `app`
    app.start();
}

ここで見逃している最大のことは、のバインディングthisが動的であり、関数を定義する方法ではなく、関数を呼び出す方法によって決定されることです。

于 2012-06-07T15:42:36.937 に答える
1

$(app.init);関数を呼び出しapp.initますが、レシーバーはappオブジェクトではありません。

そのため、baseElement変数はinit正しいオブジェクト ( app) に設定されていません。

あなたは試すことができます$(function(){app.init();app.start();});

于 2012-06-07T15:43:32.553 に答える
0

これは私があなたのコードをどのように構成するかです:

$(function() {

    app = {
        init: function() {
            this.version = '0.00.02';
            this.baseElement = $("div#app");
            this.bindEvents();
            this.start();
        },
        bindEvents: function() {
            $('body').css('background-color', 'beige');
        },
        start: function() {
            this.show();
        },
        show: function() {
            this.baseElement.html('showing this');
        }
    }

});

$(document).ready(function() {
    app.init();
});

編集:これがあなたの質問に答えないことは知っていますが、少しきれいになり、何が起こっているのかを少し理解しやすくなります..

于 2012-06-07T16:18:29.117 に答える