Подтвердить что ты не робот

"this" внутренний объект

Я пытаюсь вычислить пропорциональную высоту (исключая элемент статической высоты) из ширины, которая передается через запрос (по умолчанию - 560).

Однако wF.h оценивается как NaN. Если я заменил this.w на 560, он работает, но не при попытке ссылаться на свойство w wF.

var wF = {
       w : 560,
       h : (312 - 42) / (560 / this.w) + 42
};

Что дает?

Я отказываюсь использовать два простых вара подряд, потому что я пытаюсь получить хороший код из JS.

Update:

Спасибо всем, кто помог объяснить и решить мою проблему. Думаю, мне просто нужно привыкнуть к этому. Я буду устанавливать объект поэтапно, чтобы продолжить работу над проектом, хотя он все еще меня немного раздражает;). Я нашел и прочитал хорошую статью по этой теме для тех, кто сталкивается с подобными проблемами: http://yehudakatz.com/2011/08/11/understanding-javascript-function-invocation-and-this/

4b9b3361

Ответ 1

// Your code
var wF = {
       w : 560,
       h : (312 - 42) / (560 / this.w) + 42
};

this не то, что вы думаете,

Javascript не имеет области блока, только область функций: this внутри определения для wF не относится к wF.

(И поэтому this.w, независимо от this, вероятно undefined. Разделение на undefined дает NaN.)

Итак, вы можете попробовать:

// Let not use `this`
var wF = {
       w : 560,
       h : (312 - 42) / (560 / wF.w) + 42
};

Вы еще не закончили определение объекта

Однако вы все еще определяете объект, в котором вы пытаетесь использовать wF.w: он еще не готов для этого.


Решение

Итак, да, вам придется использовать две переменные... или настроить объект поэтапно:

// We can't even use `wF`; split up the property definitions
var wF = {};
wF.w = 560;
wF.h = (312 - 42) / (560 / wF.w) + 42;

Ответ 2

Привет, просто переопределите второе свойство как объект функции, и он будет работать. Я думаю, что можно получить доступ к контексту вызывающего объекта изнутри функции

var wF = {
    w : 560,
    h : function() { return (312 - 42) / (560 / this.w) + 42; }
};

alert(wF.h())

Ответ 3

Ключевое слово this относится к вызывающему контексту, а не к объекту.

Вам нужно сделать это в два этапа:

var wF = { w: 560 };
wF.h = (312 - 42) / (560 / wF.w) + 42;

Ответ 4

Вам не нужно обертывать {...} в Object(). Это уже литерал объекта.

this не работает внутри объектного литерала, он указывает на объект, который в настоящее время работает в этой функции:

function fn() {
   var wF = { w : 560, h : (312 - 42) / (560 / this.w) + 42 };
}

fn();

приведет к тому, что this укажет на объект window.

EDIT: предыдущий код не был предназначен для ответа, просто демонстрация того, что this. Другой возможностью было бы использование функции, которая принимает ширину в качестве аргумента:

function getObject(width) {
    width = width || 560; //Default value to 560
    return { w: width, h : (312 - 42) / (560 / width) + 42 };
}

var wF = getObject(); //To get the default value, or specify a width otherwise.

Ответ 5

Когда вы используете это в объявлении объекта JSON, он указывает на текущий экземпляр.

Вы можете попробовать этот код в консоли, чтобы лучше понять его:

Object({ w : 560, h : (312 - 42) / (560 / function(e){console.log(e);return e.w;}(this)) + 42 });