従来の概念では、JavaScript関数の合格参照パス(ポインターパスとも呼ばれます)と考えられており、一部の人々は、価値の合格と参照パスの両方が利用可能であると考えています。では、JSパラメーターが合格して何が起こっているのでしょうか。実際、次のデモはJavaで使用できます
まず、よりシンプルで基本的なタイプの配信を取得しましょう。
関数add(num){num+= 10; return num;} num = 10; alert(add(num)); aelrt(num); // output 20,10ここでの出力20と10の場合、JSの公式説明によれば、基本的なタイプパラメーターが渡されたときにコピーアクションが実行されるため、外部から宣言された変数numと関数パラメーターnumはまったく同じ値を持っていますが、パラメーターアドレスがまったく異なります。誰もお互いを知りません。また、関数パラメーター数値フレームがポップアップし、関数呼び出しが戻ります。したがって、関数パラメーターnumを変更しても、元の外部変数には影響しません。
より複雑なオブジェクト参照タイプのパスを見てみましょう:
function setname(obj){obj.name = "ted";} var obj = new object(); setName(obj); alert(obj.name); // output ted上記のコードの本質は次のとおりです。オブジェクトオブジェクトを作成し、OBJに参照を割り当てます(Cではメモリアドレスの直接の割り当てです)、そして関数パラメーターを渡すときに、以前のメソッドと同じことを行い、関数パラメーターのOBJにスタックフレームをコピーし、どちらも同じ値を持っている可能性があります(オブジェクトのアドレスと同じように理解できます)。 Java)、および変更が完了した後、関数パラメーターOBJに対応するスタックフレームもポップアップする必要があります。
したがって、対応する出力は、変更後のオブジェクトオブジェクトの値です
それから、何人かの友人が尋ねるかもしれません、これはまた、参照パス(ポインターパス)として理解することができますか?いいえ、厳密に言えば、Javaに似た言語では、ポインターはありません。 Javaでは、上記のプロセスは、シンボリックリファレンスから直接参照への解析プロセスと呼ばれます。 Cでは、ポインターは固定長(ほとんどのCコンパイラで2バイト)のタイプですが、Java同様の言語では、参照には独自のプロパティとメソッドもありますが、直接アクセスして制御することはできないため、ある意味ではオブジェクトです。このメカニズムはまた、メモリの漏れを大幅に回避し、この用語はメモリ構造化アクセスメカニズムと呼ばれます。
上記の点を証明するために、上記の例はわずかに変更されています。
function setname(obj){obj.name = "ted"; obj = new object(); obj.name = "mary";} var obj = new object(); setname(obj); alert(obj.name); // output tedこの例と前の例の唯一の違いは、新しいオブジェクトが関数パラメーターOBJに割り当てられているため、関数パラメーターOBJと元の参照OBJパラメーターが完全に異なる値とメモリアドレスを持っていることです。
上記の記事では、javaScript関数パラメーターの合格が値の合格であるか、参照の合格が私が共有したすべてのコンテンツであるかどうかについて簡単に説明します。私はそれがあなたに参照を与えることができることを願っています、そしてあなたがwulin.comをもっとサポートできることを願っています。