Объявление переменной внутри метода 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.
}
Я бы сказал, что oldIh = 10; не «объявляет» переменную, вы просто устанавливаете неопределенную переменную, и компилятор делает все возможное, чтобы это интерпретировать.
Если я использую var без этого, я не могу найти способ добраться до него
Когда вы говорите "Если я использую var без этого, я не смогу найти способ добраться до него" .... Вопрос: откуда добраться?
@LGSon, другим способом.
Написал ответ, где вы могли бы сделать этот mf.oldIh, чтобы получить его, хотя после вашего последнего комментария я начинаю задаваться вопросом, не это ли было то, что вы хотели ..? ... также добавил второй образец, показывающий, как будет работать стрелочная функция, но все же не уверен, поможет ли это
Сообщите мне, полезен ли данный ответ, или я просто удалю его.
Это полезно. Спасибо!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Добавьте 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();Нет, это не то же самое ... как видите
@LGSon - Я не могу найти разницу в указанном примере, не могли бы вы объяснить?
Спасибо, но const не подходит для этой цели.
this.oldIh = 20; не заменит const oldIh на 20
@LGSon - Да. Меняться тоже не предполагалось. Я только что избавился от const, потому что OP заявил does not fit for the purpose, что означает, что переменная будет обновлена позже, а также будет сопровождаться вашим комментарием, который каким-то образом намекает на обновление значения. Если мое понимание не синхронизировано, попросите вас предоставить некоторые подробности.
Что ж, OP написал в своем образце кода alert(oldIh); //outputs 10, would prefer 20..., так как этот ответ решает эту проблему?
Привет, ребята, спасибо за помощь. Да, значение может измениться, поэтому const не подходит. Может быть, слишком много просить, чтобы этот var xx без префикса объекта был виден где угодно за пределами области действия функции. Что меня смутило, так это, вероятно, JS откатывается к объекту окна, когда не использует var.
@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 переменные, одна из которых является областью действия, а другая - свойством объекта. Я думаю, что это невозможно без изменения структуры, и это будет регулироваться требованием.
@NikhilAggarwal Верно :)
Основываясь на комментарии, если вы хотите получить доступ к внутренний 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)Спасибо, резюмировал ситуацию в новом ответе. Прокомментируйте или проголосуйте, как хотите.
Это довольно сбивает с толку ..
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());
Спасибо всем, кто внес вклад в тему.
Вы можете посмотреть строгий режим, где будет выдана ошибка, если вы забудете использовать var для объявления переменной.