2011-02-08 24 views
1

JavaScriptを使用すると、関数Xがあり、その関数にobjectXというオブジェクトが作成されているとします。関数XはobjectXを返します。後でコード関数Z(somevar、anObject)はobjectXをそのパラメータの1つとして受け取ります。JavaScriptオブジェクトを関数パラメータとして

関数Zでは、objectXであり、すべてのプロパティは関数Z内でanObjectとして参照されていますか?

関数Zがオブジェクトを返すとどうなりますか?コードの残りの部分はオブジェクトを "objectX"または "anObject"と見なしますか?

function X() { 
    ... 
    objectX = {}; 
    ... 
    return objectX; 
} 

X(); 

function Z(anything, anObject) { 
    ... 
    return anObject 
} 

Z(something, objectX); 
+0

本当にあなたが話していることを説明する必要があります。 psudoコードなどを使用してください。あなたがそれを記述した方法では、関数Xは決して呼び出されません。 – Incognito

+0

@ user257493 - コードが追加されました。 – Ben

+0

そのコードは実行されません。 'X'関数は呼び出されません.Javascriptでは大文字と小文字が区別されるので、' x() 'は 'X()'とは異なるものです... – Martijn

答えて

1

JavaScriptはの機能範囲を有する。つまり、関数内で宣言されたすべての変数は、その関数内からのみアクセス可能です。

次のように適切に、varでobjectX変数を宣言したい場合:その後、

function X() { 
    ... 
    var objectX = {}; 
    ... 
    return objectX; 
} 

objectXX関数内objectXとして知られているであろう。それ以外の場所では、それをどのような変数に割り当てるかは知られています。あなたのコードではX()の結果を何にも割り当てないので、objectXはどこからでもアクセスすることができません。

はしかし、ここでのJavascriptのより深刻な設計上の欠陥の一つです:あなたが明示的に(varステートメントを使用して、または関数のパラメータとして)変数を宣言しないない場合、その変数は自動的にグローバル変数になります。つまり、どこでもにアクセスできることを意味します。

このため、上記のコードでは、その名前でどこでもobjectXにアクセスできます。

anObject

が、一方、適切に(パラメータとして)宣言され、それはその範囲がZ関数に限定されることを意味します。要するに

、あなたのコードが書かれている方法、objectXobjectX変数によってどこでもアクセス可能であり、かつ機能Zの内側に、あなたはobjectXようとanObjectとしても、それを参照することができます。あなたが気づいたとして -


彼らはそれが非常に困難変数は誰、と理由によって割り当てられますかを把握することができますので、グローバル変数は、悪い事™していること、しかし、注意を行います。
Javascriptでは完全に回避することはできませんが、原則として変数のスコープを可能な限り小さく保つようにしてください(scope =どこの変数にアクセスできるか)。

igorwのようなコードをリファクタリングすることをお勧めします。

4

anObjectobjectXの両方がメモリ内の同じ空間に参照するので、あなたが望むようにそれを名前を付けている、それは常に同じオブジェクトです。

幸運を祈る!

+0

@ Gonzalo - 関数Zがオブジェクトを "anObject"として返す場合でも、私はそれでもobjectXとして参照できますか? – Ben

+0

+1 "メモリ内の同じ領域を参照しています" – kjy112

4

これは主に範囲の問題です。ここで

function X() { 
    // local objectX, only accessible through this name inside X() 
    var objectX = {}; 
    objectX.foo = 'bar'; 
    return objectX; 
} 

function Z(somevar, anObject) { 
    // anObject is passed in as a parameter 
    // it's only accessible through this name inside Z() 
    anObject.foo = somevar; 
    return anObject; 
} 

// get the 'objectX' from X() and store it in global variable a 
var a = X(); 

// pass the received 'objectX' into Z() 
// note that the variable names objectX and anObject cannot be accessed 
// because they are local variables of the functions X()/Z() 
var b = Z('baz', a); 

// a is now the same as b, they both reference the same var 
// a.foo and b.foo both are set to 'baz' 
+0

@ igorw - 私はあなたが範囲について正しいとは思わない。 objectXを返すと、関数の外で実際には 'anObject'としてアクセスできます。私はすでに書いているプログラムでそれをやっています。私はコーディングの中でobjectXを関数Zに渡す必要があるかもしれないという状況に陥っています。 – Ben

+2

@Ben次に、おそらく間違っているでしょう。 varキーワードを使用しないと、varはグローバルになり(これは悪い)、どこからでもアクセスできます。 – igorw

+0

私はあなたが何を意味するかを見ます。ありがとう。 – Ben

1

jsfiddle

へのリンクである以下の次の例みましょう:あなたは、zで新しいオブジェクトを作成したが、それらが参照されているためにもかかわらず、あなたが見ることができる

Person = function(name){ 
this.name = name; 
} 

function x(){ 
    var john = new Person('john'); 
    return john; 
} 

function z(tempVar, anObject){ 
    var newObj = anObject; 
    newObj.name = tempVar; 
    return newObj; 
} 

myPerson = x(); 
console.log(myPerson.name); //john 
console.log(z('peter', myPerson).name); //peter 
console.log(myPerson.name); //peter 

を同じオブジェクトのmyPersonのnameプロパティもz()が呼び出された後に変更されます。

+0

関数xで作成されたオブジェクトにアクセスしますか? – kjy112

+0

はい。私はあなたが今言っていることを見る。ありがとう。 – Ben

+0

@Ben @Clarence Fredericksの例を見てみると、JavaScriptが 'new'をどのように使い、JavaScriptがどのようにオブジェクトを使用するのかをこのトピックで詳しく説明しています...非常に良いもの – kjy112

2

私は例が教える最善の方法だと考えています。ここではいくつかのコードが(click hereはJSビンにそれを見るために)です:

// Defines the variable to keep track of how many objects X() defines. 
var num = 1; 

// Instantiate another variable to see if it is changed by Z(). 
var anObject; 

// Creates an object with a comment and a random number. 
function X() { 
    // Create an object and give it a name. 
    var objectX = {comment : "Creation #" + num}; 
    // Increase the value of num. 
    num++; 
    // Add another random number between 0 and 100 inclusively. 
    objectX.randNum = Math.round(Math.random() * 100); 
    // Return objectX. 
    return objectX; 
} 

// Modifies the second parameter by adding the value of the first parameter. 
function Z(somevar, anObject) { 
    anObject.somevar = somevar; 
    return anObject; 
} 

var objectX = X(), objectY = X(); 
objectX2 = Z('coolness', objectX); 

// Notice that objectX is still the result of calling X() the first time. 
alert("objectX.comment = " + objectX.comment); 

// Notice that objectX is not equal to objectY. 
alert("objectX === objectY evaluates to " + (objectX === objectY)); 

// Notice that objectX2 is the same thing as objectX. 
alert("objectX === objectX2 evaulates to " + (objectX === objectX2)); 

// Notice that anObject is not defined. 
alert("typeof anObject evaluates to " + (typeof anObject) + " after Z is called.");​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​ 

alert("Now review the JavaScript code."); 

のコメントを読んでいる場合は、あなたの質問への答えを見つけるでしょう。最初に関数Zでは、関数の内部で2番目のパラメータとしてobjectXを渡して以来、anObjectによって参照される可能性があることに気づくでしょう。次に、関数Zの外にいったんanObjectがobjectXを参照しなくなることに気付くでしょう。このコメントは、JavaScriptにも当てはまる他の事柄を明らかにする。

+0

私は方法だと思います私の頭の上に – Ben

関連する問題