Там какая-либо цель к переобъявлению переменных JavaScript?

методы module_function

Модуля, которые объявляются как module_function, создадут копии себя как частный методы экземпляра в классе, который включает Модуль:

module M
  def not!
    'not!'
  end
  module_function :not!
end

class C
  include M

  def fun
    not!
  end
end

M.not!     # => 'not!
C.new.fun  # => 'not!'
C.new.not! # => NoMethodError: private method `not!' called for #<C:0x1261a00>

, Если Вы используете module_function без каких-либо аргументов, тогда какие-либо методы модуля, который прибывает после того, как module_function оператор автоматически станет module_functions сами.

module M
  module_function

  def not!
    'not!'
  end

  def yea!
    'yea!'
  end
end


class C
  include M

  def fun
    not! + ' ' + yea!
  end
end
M.not!     # => 'not!'
M.yea!     # => 'yea!'
C.new.fun  # => 'not! yea!'
6
задан Boann 4 March 2017 в 01:09
поделиться

8 ответов

На самом деле вы не повторно объявляете переменную.

Оператор переменной в JavaScript подлежит поднятию, это означает, что они оцениваются во время синтаксического анализа ] и позже в среде выполнения присваивания выполняются.

Ваш код в конце фазы синтаксического анализа перед выполнением выглядит примерно так:

var x;
x = 5;

document.write(x);
document.write("<br />");
document.write(x);
20
ответ дан 8 December 2019 в 03:39
поделиться

var сам по себе не выполняет присваивание. Это только флаги, когда вы используете имя переменной по всей области, в которой происходит вар , вы говорите о локальной переменной, а не глобальной (спорное по умолчанию). var обнаруживается при синтаксическом анализе функции и сохраняется в этой области, поэтому место, где вы ее поместили, не имеет значения:

var a= 0;

function foo() {
    a= 1;
    return a;
    var a;
}

var b= foo();
alert('global a='+a+', local a='+b);

Результат: global a = 0, local a = 1 : хотя оператор var никогда не достигается в ходе выполнения foo () , он по-прежнему эффективен для превращения в локальную переменную.

Таким образом, объявление var x во второй раз в той же области действия полностью излишне. Однако иногда вы все равно можете это сделать, обычно когда вы повторно используете имя локальной переменной для второго независимого использования в той же функции. Чаще всего:

for (var i= 0; i<onething.length; i++) {
    ...do some trivial loop...
}

for (var i= 0; i<anotherthing.length; i++) {
    ...do another trivial loop...
}

Хотя вы, конечно, можете опустить вторую var , и такие инструменты, как jslint потребуют от вас этого, на самом деле это может быть не очень хорошей идеей.

Представьте себе. позже вы измените или удалите первый цикл, чтобы он больше не объявлял i как var . Теперь оставшийся второй цикл внезапно меняет значение с локальной на глобальную переменную. Если вы не заметите при обновлении первого цикла, что второй цикл имеет скрытую зависимость от него (и вы вполне можете не заметить этого, учитывая то, как глаза пропускают шаблон for (... = 0; ..) . <...; ... ++) на «о, это всего лишь стандартный итератор»), у вас возникла тонкая и неприятная проблема с отладкой.

7
ответ дан 8 December 2019 в 03:39
поделиться

поэтому, когда во второй раз, когда его объявленный x должен быть неопределенным

В какой части спецификации говорится об этом?

«Неопределенное поведение» не означает, что «переменная будет ] undefined ".

1
ответ дан 8 December 2019 в 03:39
поделиться

Вторая переменная x совершенно лишняя.

0
ответ дан 8 December 2019 в 03:39
поделиться

В пределах той же области нет необходимости «повторно объявлять» переменную.

0
ответ дан 8 December 2019 в 03:39
поделиться

As far as my understanding of javascript goes, the use of the var keyword is completely optional in the global scope. It's a different story for functions.

When inside a function, use the var keyword to indicate that the variable is local to the function (as opposed to being global by default).

I personally use var in the global scope to show that a variable is being declared and/or utilized for the first time.

You can reference http://www.w3schools.com/js/js_variables.asp for more info.

0
ответ дан 8 December 2019 в 03:39
поделиться

Кроме того, программист может захотеть использовать var для локализации переменной:

<script>
var x= 'this is global x';
function my_x() {
 var x= 'localized x';
 alert(x);
}
my_x();
alert(x);
</script>
0
ответ дан 8 December 2019 в 03:39
поделиться

Вы не должны никогда повторно объявлять переменную в той же области, если вы действительно хотите это изменить, назначьте его. Повторное объявление не требуется для создания другого объекта на этом динамическом языке, если вы хотите, чтобы x был просто присваиваемой строкой:

x = "hello";

Не требуется, чтобы вы сначала устанавливали его на undefined или повторно объявляли.

0
ответ дан 8 December 2019 в 03:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: