Вопрос о сфере действия функции JavaScript - PullRequest
1 голос
/ 09 сентября 2011

Пожалуйста, обратитесь к следующему коду

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 [в нашем примере], потому что без возврата эта функция не выполняется.

Ответы [ 4 ]

0 голосов
/ 17 сентября 2011

что у вас там есть конструктор.Это особая функция, которая делает JavaScript более читабельным для тех, кто работает на C и Java.

Как это особенное, спросите вы?
Ну, во-первых, это просто по той причине, которую вы упомянули, не возвращая объект, с которым вы играете.Если вы ничего не возвращаете, возвращается значение this пустого объекта.Обычно в функции this относится к window или другим вещам, основанным на ситуации, например, o.method this относится к o в нормальных ситуациях.В вашем случае это конструктор, и вы назвали его новым, поэтому this относится к новому пустому объекту с прототипом, установленным на createCar.prototype, и prototype.constructor, указывающим на createCar.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, я никогда не использую конструкторы, но это хороший способ намочить ноги.

0 голосов
/ 09 сентября 2011

Вот код с правильным отступом.

Как видите, return является частью функции createCar.Без возврата он вернет undefined и, следовательно, oCar1 и oCar2 не будут установлены правильно, а метод showColor() не будет существовать для переменных.

Просто для подтверждения очевидного;это скобки {}, которые определяют объем.return относится к области видимости скобок {} внутри, в данном случае creatCar scope / круглых скобок.

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 голосов
/ 09 сентября 2011
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”

то же самое с этим. Вам нужно "новое".

0 голосов
/ 09 сентября 2011

Возвращает созданный новый объект (oTempCar).

Без return, undefined будет неявно присвоено oCar1 и oCar2.

...