2011-09-09 4 views
1

JavaScript関数のスコープの質問

function createCar(sColor, iDoors, iMpg) { 
    var oTempCar = new Object; 
    oTempCar.color = sColor; 
    oTempCar.doors = iDoors; 
    oTempCar.mpg = iMpg; 
    oTempCar.showColor = function() { 
     alert(this.color) 
    }; 
    return oTempCar; 
} 
var oCar1 = createCar("red", 4, 23); 
var oCar2 = createCar("blue", 3, 25); 
oCar1.showColor(); //outputs “red” 
oCar2.showColor(); //outputs “blue” 

私の質問は、次のコードを参照してくださいですいただきました上記の関数で戻りの主な用途?関数によって作成されたオブジェクトを返し、すべてのプロパティをoCar1とoCar2(この例では)cozに代入します。この関数は失敗します。

+1

あなた自身の質問に答えました。あなたが知りたいことが他に何かありますか? –

+1

はい、あなたは常に傲慢からコードをインデントする必要があります。 –

答えて

0

作成した新しいオブジェクト(oTempCar)を返します。

returnがない場合、undefinedは、oCar1oCar2に暗黙的に割り当てられます。

0

ここに正しくインデントされたコードを示します。

ご覧のとおり、returncreateCar機能の一部です。戻り値がなければ、undefinedが返され、oCar1oCar2が正しく設定されず、変数にshowColor()メソッドが存在しません。

スコープを決定するのは括弧{}です。 returnは、内括弧{}のスコープに属しています。この場合は、creatCarスコープ/カッコです。

function createCar(sColor, iDoors, iMpg) { 
    var oTempCar = new Object; 
    oTempCar.color = sColor; 
    oTempCar.doors = iDoors; 
    oTempCar.mpg = iMpg; 
    oTempCar.showColor = function() { 
     alert(this.color) 
    }; 
    return oTempCar; 
} 
var oCar1 = createCar("red", 4, 23); 
var oCar2 = createCar("blue", 3, 25); 
oCar1.showColor(); //outputs “red” 
oCar2.showColor(); //outputs “blue” 
0
function createCar(sColor, iDoors, iMpg) { 
    this.color = sColor; 
    this.doors = iDoors; 
    this.mpg = iMpg; 
    this.showColor = function() { 
     alert(this.color) 
    }; 
} 
var oCar1 = new createCar("red", 4, 23); 
var oCar2 = new createCar("blue", 3, 25); 
oCar1.showColor(); //outputs “red” 
oCar2.showColor(); //outputs “blue” 

それはthis.youは "新" が必要と同じです。

0

コンストラクタがあります。 CとJavaの人々にJavaScriptをより読みやすくするための特殊な関数です。

どのように特別な質問をしますか?
これはまさにあなたが演奏しているオブジェクトを返さずに言及した理由によるものです。何も返さなければ、空のオブジェクトthisの値を返します。通常、関数内でthisは、windowを参照するか、またはo.methodthisなどの状況に基づく他のものは、通常の状況下でoを参照します。あなたの場合、これはコンストラクタであり、新しいもので呼び出されたため、にプロトタイプを設定し、createCar.prototype.constructorを指すprototype.constructorを指す新しい空のオブジェクトを指します。createCarです。上記の回答が指摘しているように、これを修正すると、あなたが期待しているような動作が得られます。これはちょうどうまくいくものです。

これらの回答はCコードのように見えますが、JavaScriptコードをどのように楽しくしていますか?試してみてください:

function createCar(sColor, iDoors, iMpg) { 

    this.color = sColor; 
    this.doors = iDoors; 
    this.mpg = iMpg; 
    //return this; //Not needed, but is what happens under the covers 
} 

createCar.prototype = { 

    showColor: function(){ 

     alert(this.color); 
    } 
} 

var oCar1 = createCar("red", 4, 23); 
var oCar2 = createCar("blue", 3, 25); 
oCar1.showColor(); //alerts “red” 
oCar2.showColor(); //alerts “blue” 

もう、退屈です!もっと楽しいことができます。

createCar.prototype.showColor.call(oCar1); //Alerts "red" 
createCar.prototype.showColor.call(new createCar("red")); //Also alerts red 

TBH、私は決してコンストラクタを使用しませんが、あなたの足を濡らすための良い方法です。