Каково различие в стиле закрытия

Сначала вы должны убедиться, что у вас установлены драгоценные камни Jekyll и Bundler с

$ jekyll -v

, вы должны увидеть

jekyll 3.8.5 -- Jekyll is a blog-aware, static site generator in Ruby

, если он не установлен, установить с

$ gem install jekyll bundler
[ 119] Если он установлен, вам просто нужно использовать команду jekyll (не команда bundle) в корне вашего сайта

$ jekyll serve
$ jekyll build

, и да, я нахожу получающим начал на сайте, также немного сбивает с толку ...

22
задан doekman 8 August 2008 в 20:53
поделиться

6 ответов

Оба случая выполнят функцию, единственная реальная разница - то, чем возвращаемое значение выражения может быть, и чем значение "этого" будет в функции.

В основном поведение

new expression

эффективно эквивалентно

var tempObject = {};
var result = expression.call(tempObject);
if (result is not an object)
    result = tempObject;

, Хотя, конечно, tempObject и результат являются переходными значениями, Вы никогда не можете видеть (они - детали реализации в интерпретаторе), и нет никакого механизма JS, чтобы сделать, "не объектная" проверка.

Вообще говоря "новая функция () {..}" Метод произойдет медленнее из-за потребности создать этот объект для конструктора.

, Который сказал, это должно быть не быть реальной разницей, поскольку объектное выделение не является медленным, и Вы не должны использовать такой код в горячем коде (из-за стоимости создания функционального объекта, и связал закрытие).

Редактирование: одна вещь я понял, что отсутствовал в этом, состоит в том, что эти tempObject доберется expression прототип с, например, (перед expression.call) tempObject.__proto__ = expression.prototype

10
ответ дан 29 November 2019 в 05:51
поделиться

@Lance: первый также выполняется. Сравните его с именованным конструктором:

function Blah() {
    alert('blah');
}
new Bla();

это на самом деле также выполняет код. То же идет для анонимного конструктора...

, Но это не было вопросом ;-)

5
ответ дан 29 November 2019 в 05:51
поделиться

Ну, я сделал страницу как это:

<html>
<body>
<script type="text/javascript">
var a = new function() { 
  alert("method 1");

  return "test";
};

var b = (function() {
  alert("method 2");

  return "test";
})();

alert(a);  //a is a function
alert(b);  //b is a string containing "test"

</script>
</body>
</html>

Удивительно достаточно (мне так или иначе) это предупредило и "метод 1" и метод 2". Я не ожидал, "что метод 1" будет предупрежден. Различие было, каковы значения a и b были. самой функции, в то время как b был строкой что возвращенная функция.

0
ответ дан 29 November 2019 в 05:51
поделиться

Они оба создают закрытие путем выполнения блока кода. Как стиль я очень предпочитаю второе по нескольким причинам:

Это не сразу очевидно путем поглядывания на первое, что код будет на самом деле выполнен; строка похожа , это создание новая функция, вместо того, чтобы выполнить его как конструктора, но это не то, что на самом деле происходит. Избегайте кода, который не делает то, что похоже, что это делает!

Также (function(){... })(); делают хорошие маркеры держателя для книг так, чтобы можно было сразу видеть, что Вы вводите и оставляете объем закрытия. Это хорошо, потому что это предупреждает программиста, читающего его в изменение объема, и особенно полезно при выполнении некоторой постобработки файла, например, для минификации.

3
ответ дан 29 November 2019 в 05:51
поделиться

Да, существуют различия между двумя.

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

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

Пример:

<html>
<body>
<script type="text/javascript">

new function() { 
a = "Hello";
alert(a + " Inside Function");
};

alert(a + " Outside Function");

(function() { 
var b = "World";
alert(b + " Inside Function");
})();

alert(b + " Outside Function");
</script>
</body>
</html>

В вышеупомянутом коде вывод - что-то как:

Привет В Функции
Привет Вне Функции
Мир В Функции

... затем, Вы получаете ошибку, поскольку 'b' не определяется вне функции!

Таким образом, я полагаю, что второй метод лучше... более безопасный!

-4
ответ дан 29 November 2019 в 05:51
поделиться

Второй пример выполнит функцию после создания его.

редактирование: это не действительно верно.

0
ответ дан 29 November 2019 в 05:51
поделиться
Другие вопросы по тегам:

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