1

JavaScript 関数を動作させることができません。

if (!cHp) { cHp = 200 };

魔法のように機能しますが、

function checkNull(x, y) {
if (!x) { x = y; }
}

まったく機能しません。

私は何を間違っていますか?

4

2 に答える 2

7

これは機能しますが、JavaScript は純粋に値による呼び出しであるため、何の役にも立ちません。つまり、関数内のパラメーター "x" と "y"には、呼び出し環境に存在する値のコピーが含まれています。

したがって、

checkNull(b, 2 + 17);

変数 "b" の値と数値 19 のコピーが関数に渡されます。この関数は、"x" と "y" に対して何でも実行できますが、呼び出しコンテキストの変数 "b" には何の違いもありません。

編集— このトピックを拡張して、長すぎるコメント スレッドを切り上げてもよろしいですか。「値による呼び出し」(および対照的に「参照による呼び出し」) が何を意味するかについて話しましょう。値による呼び出しパラメーター受け渡し方式では、呼び出し環境の実際のパラメーターの値が、呼び出された関数のパラメーター変数にコピーされます。参照渡しスキームでは、呼び出し環境内のある種の変数への参照が、呼び出された関数に渡されます。それらの2つはどのように異なりますか?

値渡し方式では、次のようになります。

var a = 1;
function change(b) {
  b = 2;
}

change(a);
alert(a); // still 1

ただし、参照渡し方式では、次のことが当てはまります。

// FANTASY CODE - NOT REAL JAVASCRIPT
var a = 1;
function change(b) {
  b = 2;
}

change(a);
alert(a); // it is 2 in this fantasy call-by-reference code

参照渡しスキームの 1 つの意味は、呼び出し環境の実際のパラメーターは、変数またはオブジェクト プロパティなどでなければならないということです。つまり、プログラミング言語用語で「左辺値」と呼ばれるものでなければなりません。別の言い方をすれば、代入式の左側に現れるものでなければならないということです。

JavaScript の変数がオブジェクトを「値」として受け取る方法が原因で、少し混乱します。オブジェクトを変数に割り当てる場合:

var myObj = {};

オブジェクトへの参照を実際に割り当てています。これは JavaScript では完全に透過的であり、実際に考える必要はありません。オブジェクト値のジャグリングは、JavaScript のプリミティブ値と同じくらい簡単です。ただし、オブジェクト値が関数に渡されるとき、変数の実際の値がオブジェクトへの参照であるという事実は、JavaScript の値渡しセマンティクスが呼び出し渡しに似ているように見えることを意味します。 -参照スキーム:

var a = { property: 1 };
function change(b) {
  b.property = 2;
}

change(a);
alert(a.property); // it's 2!! OMG call-by-reference! (not)

はい、関数がパラメーターとして渡されたオブジェクトのプロパティの値を変更することは可能です。それは参照渡しですか? いいえ、そうではありません。少なくとも、「参照渡し」という用語の意味を気にしている場合はそうではありません。その関数は「プロパティ」プロパティの値を変更できますが、「a」自体の値を変更することはできません! それが参照渡しの意味です。

現在めったに見られない他のパラメーター受け渡しスキームがあります。ちょっと魅力的なのは、ALGOL 60 の「call-by-name」です。そのスキームが行ったことは、呼び出された関数でパラメーターへの参照が再生成されるように、実際のパラメーターを暗黙の関数のように扱うことでした。パラメータ式を評価します。「call-by-value/result」もあります。これは、実際のパラメーターが値で渡されることを意味しますが、関数が返すと、関数内のパラメーターの現在の値が、呼び出し元のソース変数に暗黙的にコピーされます。環境。(このスキームでは、参照渡しのように、実際のパラメーターが左辺値である必要もあります。)

于 2013-04-24T13:43:26.473 に答える
0

あなたがする必要があるのは、関数に値を返させ、その戻り値を変数に割り当てることです。次のようなことを試してください:

var checkNull = function (x, y) {
        if (!x) {
            return y;
        }
        return x;
    },
    cHp,
    testVar;

cHp = checkNull(testVar, 200);  // will return 200 since testVar is undefined

testVar = 100;

cHp = checkNull(testVar, 200);  // will return 100 since testVar is defined
于 2013-04-24T14:13:51.277 に答える