0

私が作成しているJavaScriptクラスがあります。このクラスには、プライベートおよびパブリックの関数/プロパティがあります。プライベートとパブリックについての私の理解は、それthisがパブリックでありvar、その機能とそのメンバーにとってプライベートであるということでした。ただし、ローカル関数内でbuildFramework()を呼び出すとvar settings.currentView、エラーが発生します。

settings.currentView定義されていません

this私の質問は、関数とそのメンバーのスコープとvarグローバルスコープの違いは何ですか?

namespace('example');
example.InstagramViewer = function (options) {
    // this works when called within buildFramework()
    this.settings = $.extend({
        currentView: 'grid'
    }, options);

    // this doesn't work when called within buildFramework()
    var settings = $.extend({
        currentView: 'grid'
    }, options);

    var viewer;

    this.init = function () {
        buildFramework();
    };

    var buildFramework = function() {
        viewer = $(viewerWrapper).append('<div id="instagramViewer" class="' + settings.currentView + '"></div>'); // this doesn't work
        viewer = $(viewerWrapper).append('<div id="instagramViewer" class="' + this.settings.currentView + '"></div>'); // this does work
    };
}

と、そう呼んで…

$(function () {
    var viewer = new connectionsAcademy.publicWebsite.web.js.teenWebsite.InstagramViewer();
    viewer.init();
});
4

5 に答える 5

2

ここには多くの違いがあります。

まず、'this' は呼び出し元オブジェクトへの参照であるキーワードです。関数をそのまま呼び出すと、ウィンドウが呼び出しオブジェクトになり、キーワード「this」を使用してグローバル変数を設定します。

InstagramViewer();
console.log(window.settings);

ただし、別のオブジェクトを介して関数を呼び出すと、window は呼び出し元のオブジェクトではなくなり、グローバル変数を設定する代わりに、そのオブジェクトにメンバー変数を設定することになります。

var obj = {InstagramViewer: InstagramViewer};
obj.InstagramViewer();
console.log(obj.settings);

これらの両方の場合で「var」を使用しても違いはありません。「var」は、関数のスクラッチパッドと呼ぶもの以外のオブジェクトに影響を与えないため、「this」とは異なる動作をします。関数のみがそのスクラッチパッドにアクセスできます (このスクラッチ パッドで変数を公開するある種のクロージャーを作成しない限り)。これが、「var」で定義された変数がプライベートであると考えることができる理由です。

「delete」を扱う場合、「var」の使用も「this」の使用とは異なります。「delete」は「var」で宣言された変数では機能しませんが、「this」またはその他のオブジェクトで変数を定義する場合は機能します。

var F = function() {
    this.foo = 'foo';
    var bar = 'bar';

    delete(bar);
    delete(this.foo);

    alert(bar);
    alert(this.foo);
};


F();

私の説明は大雑把ですが、この文脈では簡単には説明できない大きなテーマです。この本を読むことを強くお勧めしますhttp://shop.oreilly.com/product/9780596000486.do . 特に7章。

于 2012-09-11T21:38:17.140 に答える
1

プライベートとパブリックについての私の理解は、これはパブリックであり、 var はその関数とそのメンバーに対してプライベートであるということでした

それは正しくありません。

var <variable_name>現在のスコープで対応する名前の変数を宣言します。変数名が間違っているvar foo.barため書き込めません。foo.bar

this.namename-オブジェクトのプロパティにアクセスしていますthis

于 2012-09-11T21:12:03.860 に答える
0

オブジェクトのクロージャー内で関数を定義するだけの場合、それらは「プライベート」です。オブジェクト自体に属性として追加することで、それらを公開することができます。

function ObjectWithPrivateFunction() {

  var _privateVariable = 0;

  function _privateFunction(someValue) {
    _privateVariable = someValue;
  } // _privateFunction()

  this.publicAccessToPrivateFunction = _privateFunction;

} // ObjectWithPrivateFunction()
于 2012-09-11T21:16:21.730 に答える
0

1) あなたは混乱scopeしていcontextます。
2) 他の言語とthisは異なり、変更可能です。バインドされているオブジェクトの呼び出し元に依存します。
3) javascript には「プライベート」または「パブリック」はありません。常にパブリックであり、囲んでいる関数のスコープに制限されている変数であるオブジェクト プロパティのみがあります。次の例を検討してください。

var object = {
    x:10,
    func: function(){
        var x = 1;
        console.log(x, this.x);
    }
}

object.func();が出力1され10、両方xが共存するため (要素のプロパティとしての 1 つ)、objectこれはコンテキストであり、もう1 つxはそれを囲む関数のスコープに制限された変数です。

あなたは同じことをしています-thisオブジェクトにプロパティを作成しています(これも非常に重要です-this関数の呼び出し方法に応じて変更可能です)、JSがスコープをチェックするため、失敗settingするプロパティで変数にアクセスしようとしていますが、currentView対応する変数が見つかりません。

于 2012-09-11T21:45:17.700 に答える
-1

非常に大まかに言えば、キーワードは厳密にプライベートthisであるパブリッククラスのようなものです。var

例えば、

function testPublic(str)
{
    this.getTHIS=function()
                 {
                     alert(str)
                 }
}

function testPrivate(str)
{
    var getTHIS=function()
                {
                    alert(str);
                }
}


//now run the code
new testPublic('hello there').getTHIS(); //alert hello there

ただし、2つ目は、親関数の外部からgetTHIS関数にアクセスすることはできません。

于 2012-09-11T21:55:19.097 に答える