0
var abc = {
    'a': 10,
    'b': 10,
    c: function() {
        //like if I have many many functions in c
        init_a();
        multiple();

        function init_a() {
            abc.a = 30;
        }

        function multiple() {
            alert(abc.a * abc.b);
        }

        function minus() {
            alert(abc.a - abc.b);
        }
        return {
            function myalert() {
                var result = abc.a + abc.b;
                alert(result);
            }
        }
    },
    d: function() {
        abc.c.myalert(); // ???  error??
        abc.c().myalert(); // ??? error??  **it run all functions in c but not just myalert, strange things happening...
    }

}
abc.d();

関数dで「myalert()」関数を呼び出すための正しい構文は何ですか?

4

3 に答える 3

6

myalert()関数に対してローカルだったのでabc.c()、それは不可能です。

c()ただし、返すことができmyalert()ます:

c: function() {
    return function myalert() {
      // whatever
    }
}, d: function() {
    this.c()()
}

返される関数に名前を付ける必要がないことに注意してくださいreturn function() { .. }

アップデート

this.c().myalert()のように呼び出したい場合c()は、関数を直接返すのではなく、オブジェクトを返す必要があります。

c: function() {
    return {
        myalert: function() { ... }
    }
}

更新 2

c()関数には、 の宣言以外のステートメントが含まれるようになりましたmyalert()。呼び出されると、init_a()返さmultiple()れる前に呼び出されます。

myalert()代わりにメイン オブジェクトに移動するなど、コードをリファクタリングすることをお勧めします。

var abc = {
    a: 10,
    b: 10,
    c: function() { ... }
    myalert: function() { ... }
    d: function() {
        this.myalert();
    }
}
于 2012-12-03T11:54:09.827 に答える
2

c以下を含むオブジェクトを返すことができますmyalert:

var abc = {
    'c': function() {
        return {
            myalert: function() {
                alert('foo');
            }
        };
    },
    'd': function(){
        abc.c().myalert(); // foo
    }
};
abc.d();​

デモ: http://jsfiddle.net/g2KEK/

于 2012-12-03T11:56:00.383 に答える
0
c: function() {
    return {
        myalert : function() {
            // whatever
        }
    }
}, d: function() {
    this.c().myalert()
}
于 2012-12-03T12:00:31.697 に答える