Лучшая практика для общей переменной в объекте javascript

Объявление переменной внутри метода javascript, похоже, ограничивает ее оконным объектом, есть ли способ изменить это поведение?

var mf = new Array();

mf.init = function () {
    oldIh = 10;
    this.oldIh = 20;
    alert(oldIh); //outputs 10, would prefer 20...
    alert(window.oldIh); //outputs 10.        
}

Вы можете посмотреть строгий режим, где будет выдана ошибка, если вы забудете использовать var для объявления переменной.

Strille 25.06.2018 13:14

Я бы сказал, что oldIh = 10; не «объявляет» переменную, вы просто устанавливаете неопределенную переменную, и компилятор делает все возможное, чтобы это интерпретировать.

DBS 25.06.2018 13:15

Если я использую var без этого, я не могу найти способ добраться до него

Teson 25.06.2018 13:16

Когда вы говорите "Если я использую var без этого, я не смогу найти способ добраться до него" .... Вопрос: откуда добраться?

Ason 25.06.2018 13:33

@LGSon, другим способом.

Teson 25.06.2018 13:53

Написал ответ, где вы могли бы сделать этот mf.oldIh, чтобы получить его, хотя после вашего последнего комментария я начинаю задаваться вопросом, не это ли было то, что вы хотели ..? ... также добавил второй образец, показывающий, как будет работать стрелочная функция, но все же не уверен, поможет ли это

Ason 25.06.2018 14:00

Сообщите мне, полезен ли данный ответ, или я просто удалю его.

Ason 25.06.2018 14:07

Это полезно. Спасибо!

Teson 25.06.2018 14:22
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
8
103
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Добавьте var или let

var mf = new Array();

mf.init = function () {
    let oldIh = 10;
    this.oldIh = 20;
    alert(oldIh); //outputs 10
    alert(window.oldIh); //outputs undefined      
}

mf.init();

Нет, это не то же самое ... как видите

Ason 25.06.2018 13:14

@LGSon - Я не могу найти разницу в указанном примере, не могли бы вы объяснить?

Nikhil Aggarwal 25.06.2018 13:17

Спасибо, но const не подходит для этой цели.

Teson 25.06.2018 13:19

this.oldIh = 20; не заменит const oldIh на 20

Ason 25.06.2018 13:25

@LGSon - Да. Меняться тоже не предполагалось. Я только что избавился от const, потому что OP заявил does not fit for the purpose, что означает, что переменная будет обновлена ​​позже, а также будет сопровождаться вашим комментарием, который каким-то образом намекает на обновление значения. Если мое понимание не синхронизировано, попросите вас предоставить некоторые подробности.

Nikhil Aggarwal 25.06.2018 13:40

Что ж, OP написал в своем образце кода alert(oldIh); //outputs 10, would prefer 20..., так как этот ответ решает эту проблему?

Ason 25.06.2018 13:42

Привет, ребята, спасибо за помощь. Да, значение может измениться, поэтому const не подходит. Может быть, слишком много просить, чтобы этот var xx без префикса объекта был виден где угодно за пределами области действия функции. Что меня смутило, так это, вероятно, JS откатывается к объекту окна, когда не использует var.

Teson 25.06.2018 13:56

@LGSon - Ой! Я нацелился на вопрос, заданный Declaring a variable inside a javascript method seems to scope it to the window-object, is there any way to change that behaviour?. Я проигнорировал вопрос в комментарии. Кроме того, вы не можете сохранить измененное значение в журнале, сохраняя 2 переменные, одна из которых является областью действия, а другая - свойством объекта. Я думаю, что это невозможно без изменения структуры, и это будет регулироваться требованием.

Nikhil Aggarwal 25.06.2018 14:08

@NikhilAggarwal Верно :)

Ason 25.06.2018 14:09

Основываясь на комментарии, если вы хотите получить доступ к внутренний this.oldIh извне, просто используйте его функциональную переменную, например

Фрагмент стека

var mf = new Array();

mf.init = function () {
    oldIh = 10;
    this.oldIh = 20;
}

mf.init();

console.info(oldIh)
console.info(mf.oldIh)

Если вы используете стрелочную функцию, this в этом случае будет ссылаться на глобальную область видимости и изменять значение, и она будет доступна без переменной функции.

Фрагмент стека

var mf = new Array();

mf.init = () => {
    oldIh = 10;
    this.oldIh = 20;
}

mf.init();

console.info(oldIh)

Спасибо, резюмировал ситуацию в новом ответе. Прокомментируйте или проголосуйте, как хотите.

Teson 25.06.2018 16:30
Ответ принят как подходящий

Это довольно сбивает с толку ..

1) Использование вар не разрешено для объявления this.varaibleName

2) Использование вар внутри метода определяет переменную только для метода.

3) Отсутствие использования вар или это создает переменную окна (не разрешено в строгом режиме)

4) Решение состоит в том, чтобы использовать this.variableName без вар, что прекрасно даже в строгий режим.

'use strict';

var mf = new Array();

mf.init = function () {
    this.oldIh = window.innerHeight;
    //Not allowed:
    //var this.oldIh = window.innerHeight;
    //
    //Creates a var for this method only
    //var oldIh = 123;
    //
    //Creates a window-variable (not allowed in strict mode)
    //oldIh = 123;
}

mf.getInnerHeight = function () {
  return this.oldIh;
}

mf.init();
alert(mf.getInnerHeight());

Спасибо всем, кто внес вклад в тему.

Другие вопросы по теме