Немедленные функции JavaScript

Стоян Стефанов говорит в шаблонах JavasScript, что: "вам нужна непосредственная функция, чтобы обернуть весь ваш код в его локальной области и не просачивать какие-либо переменные в глобальную область" стр. 70.

Вот его пример

(function() {
    var days = ['Sun','Mon'];
    // ...
    // ...
    alert(msg);
}());

Но, конечно, потому что дни определяются как var, это будет просто функциональная область? Единственным преимуществом непосредственной функции является то, что функция вызывается немедленно. Преимущество не имеет. Corrcet?

Ответ 1

Это не о немедленно выполненной функции против обычной функции; на самом деле это имеет очень мало или ничего общего.

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

(function() {
    // This variable is only available within this function scope
    var thisIsTemp = "a";

    // ...
}());

function example(){
    console.log(thisIsTemp); // undefined        
}

против:

// This variable is available globally
var thisIsTemp = "a";

// ...

function example(){
    console.log(thisIsTemp); // "a"
}

Ответ 2

Наличие переменной days в области функций - это именно то, что делает этот пример. Без немедленно вызываемой функции все переменные (days, msg) будут глобальными переменными и будут загрязнять глобальное пространство имен.

Ответ 3

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

  • у вас есть код, который вы хотите запустить прямо сейчас
  • вы не хотите, чтобы этот код пропускал имена в текущую область.

Таким образом, функция создается из-за # 2, но она также вызывается сразу из-за # 1.

Ответ 4

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

Это неверно. (Или, по крайней мере, это спорно)

Я думаю, что OP спрашивал: "Нужна ли вам немедленная функция для создания локальной области или вы можете просто использовать нормальную область функций?" Я согласен с OP, что функция И немедленная функция скроет переменную days в своей собственной области. Чтобы проверить, является ли переменная глобальной, (в консоли), вы можете проверить, определено ли это на window.

Немедленная функция:

(function() {
    var days = ['Sun','Mon'];
    // ...
    // ...
    alert(msg);
}());
window.days; // undefined

Нормальная функция:

var func = function() {
    var days = ['Sun','Mon'];
    // ...
    // ...
    alert(msg);
};
window.days; // undefined
Object.prototype.toString.call(window.func); // "[object Function]"

Как вы можете видеть, days не является глобальным в обоих случаях. Он скрыт или закрыт в пределах области действия. Однако сделал глобальный, func во втором примере. Но это доказывает, что вам не нужна немедленная функция для создания локальной области.

PS: Я никогда не читал эту книгу. Я уверен, что автор умный и знает, о чем идет речь, но в этом конкретном случае просто недостаточно. Или, может быть, нам нужно больше контекста, связанного с цитатой, чтобы полностью понять его.

Ответ 5

Идея var быть внутри функции

не просачивать какие-либо переменные в глобальную область

Дело в том, что в этом случае дни не будут видны вне функции, и если вы попытаетесь написать в консоли console.log(days), вы получите дни не определены

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

Ответ 6

days все еще находится в локальной области действия функции. То, что вы здесь делаете, выполняет задачу внутри локальной области, поэтому все, что вы определяете внутри этой области, не загрязняет глобальное пространство имен. В противном случае в глобальном масштабе вы будете иметь следующее:

var days = ['Sun','Mon'];
// ...
// ...
alert(msg);

Ответ 7

В JavaScript локальные переменные имеют область действия, а не область блока. Например, в опубликованном вами коде days на самом деле является локальным для функции:

(function() {
  var days = ['Sun','Mon'];
  // ...
  // ...
  alert(msg);
}());

Но если вы скажете следующее, в глобальной области:

// ...
{ 
    var days = ['Sun','Mon'];
    // ...
    // ...
}
alert(msg);

days станет глобальной переменной (видимой для всего во внешней области), хотя она определена внутри блока. Это имеет смысл?

Ответ 8

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

var func = function() {
var days = ['Sun','Mon'];
// ...
// ...
alert(msg);
func();

дни также находятся в локальной области func, а не глобальной переменной