1

addChangedValue 関数の sampleViewModel インスタンスが undefined または null でないのはどうしてでしょうか?

私の理解では、インスタンス化の範囲から、sampleViewModel は addChangedValue 関数で認識されるべきではありません。

$(function(){

    var PersonViewModel = function() {
        var me = this;
        me.firstName = ko.observable('Lisa'),
        me.lastName = ko.observable('T'),
        me.changes = ko.observableArray()
    };

    var sampleViewModel = new PersonViewModel();

    sampleViewModel.firstName.subscribe(function(newValue) {
        addChangedValue("firstname refreshed: " + newValue);
    });

    function addChangedValue(updatedValue) {
        sampleViewModel.changes.push({ value: updatedValue });
    };

    ko.applyBindings(sampleViewModel, document.getElementById('data'));
});
4

3 に答える 3

2

それは間違いなくそうです。クロージャーは、それらが定義されているスコープに字句的にバインドされているため、クロージャーも定義されているスコープで定義されたものはすべて、そのクロージャーに認識されます。

また、その関数内で同様の名前の変数を定義してシャドウしない限りaddChangedValue、それを囲むスコープ内の任意の変数にアクセスできます。

于 2013-04-08T16:36:42.497 に答える
1

addChangedValueクロージャを形成する引数である無名関数。sampleViewModel関数内の変数は、囲んでいるスコープ内の変数と同じです。クロージャーは、関数(多くの場合、あなたの場合のように匿名)とコンテキストの組み合わせです。関数が宣言されているときのスコープ内のすべての変数は、その関数内で使用できます。閉鎖については、こちらをご覧ください。

于 2013-04-08T16:36:11.523 に答える