1
var a,b,c;

function abc(a,b,c){
   console.log("a is"+ a + ", b is"+ b + ", c is"+ c);
}

a; // undefined
b; // undefined
c; // undefined

文字列、、を通過させますabc関数を通過したらそれらにもアクセスできるようにしたいと思います。

したがって、を呼び出す場合はabc("d","e","f")、これらの3つの文字列を使用してその関数を実行したいのですが、その後、独自のスコープ外で、、、およびを使用できるようにしたいとa="d"思いb="e"ますf="f"

誰かがこれがどのように行われるか説明できますか?関数の外で宣言されていても、同じ名前であるという事実は私を失望させていると思います。

パラメータの前に追加することについてPHPで何かを覚えてい&ます...

ありがとう!

4

4 に答える 4

3

ここで何を求めているのかわかりませんが、箱から出してすぐに使用できます。

ECMAscriptには関数スコープがあるため、変数aは、の関数コンテキスト内でローカルに解決されbます。これらの変数名外部宣言 (自由変数と呼びます)は、ルックアッププロセスが独自のコンテキスト内で最初にそれらの名前を見つけて解決し、そこで停止するため、アクセスされることはありません。cabc()

親コンテキストの一部である自由変数を設定したいだけの場合は、便宜上、仮パラメータの名前を変更してから、値を渡す必要があります。

function abc(some, other, name) {
    a = some;
    b = other;
    c = name;
}

、、およびが宣言されている親スコープグローバルスコープではないことを願っています。それは、いくつかの理由から、依然として非常に正確に悪い習慣とカルマと見なされています。abc

于 2013-02-14T23:47:05.050 に答える
2

ベストプラクティスは、内部変数に異なる名前を付けることです。たとえば、「inner」または関数名のイニシャルを前に付けます。次に、単純なで値を外部変数に割り当てるだけでなくa = innerA、コードを読みやすくします。

于 2013-02-14T23:48:48.923 に答える
1

同じ名前の関数パラメーターでマスクされている場合、外部スコープの変数を使用することはできません。

それらが外部スコープにある変数のプロパティに名前が付けられている場合は、可能です。ブラウザでは、グローバル変数は実際にはwindow変数の単なるプロパティです。

var myobj = {};

function abc(a, b, c) {
    myobj.a = a;
    myobj.b = b;
    myobj.c = c;
}

// you can now use those values
于 2013-02-14T23:46:50.857 に答える
1

まず、私はあなたが意味すると思います:

var a, b, c;

function abc(_a, _b, _c) {
    a = _a;
    b = _b;
    c = _c;
}

abc(1, 2, 3);
console.log("a is"+ a + ", b is"+ b + ", c is"+ c); // 1, 2, 3

そうは言っても、このアプローチは良い習慣ではないと思います。クロージャまたは名前空間内でそれらを整理してください。たとえば、許容できるデザインパターンは次のとおりです。

(function(g) {

    var _SomeClass = function(a, b, c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    _SomeClass.prototype = {
        printValues: function() {
            console.log(this.a, this.b, this.c);
        },
        doSomething: function() {
            // do something here
        },
        _privateMethod: function() {
            // should not be called from outside the closure
        }
    }

    g.SomeClass = _SomeClass;

})(window);

var myClass = new SomeClass(1, 2, 3);
myClass.printValues();
于 2013-02-14T23:49:33.050 に答える