2015-01-23 6 views
0
var test = function(x) { 
     return x + 2; 
    }; 

и я могу использовать тест (3)В чем разница между этими двумя?

, но когда я использую

var test = (function(x) { 
     return x + 2; 
    })(); 

Я не могу использовать тест (3)

почему?

+0

потому, что во втором примере вы определяете тест в качестве возвращаемого значения, а не функция – atmd

+0

Потому что() выполняет функцию в runtime немедленно, поэтому test получает результат функции без аргументов (NaN). Затем вы пытаетесь запустить NaN как функцию. –

+0

Вы можете сделать «var test = (function (x) {return x + 2;}) (3);', но это побеждает точку функции. – Andy

ответ

0

Второй фрагмент кода - пример IIFE - Immediately-Invoked Function Expression.

Результат выражения внутри первого набора парендов определяет функцию, которая принимает один параметр (по имени x). Второй набор parens немедленно вызывает его, возвращая результат. Поскольку вы не передали никаких аргументов при вызове, x - undefined, поэтому он вычисляет выражение undefined + 2 и возвращает NaN.

0

В первом случае является определение функции, так что вы можете сделать test(3)

Во втором случае вы executing функция, поэтому, возможно, вы получаете NaN как результат.

0

Во втором примере вы используете закрытие JavaScript. Закрытие позволяет вам контролировать область охвата и пространство имен, а также объявлять частные методы и переменные.

Рассмотрим следующий пример:

var test = (function() { 
var privateVar1; 
var privateVar2; 

function privateFunction() { 
} 

return { 
    publicFunction1: function() { 
    }, 
    publicFunction2: function() { 
    } 
}; 
})(); 

test теперь равна следующему:

{ publicFunction1: function() {}, publicFunction2: function() {} }

Функция немедленно вызывается после того, как был объявлен, в какой момент x не имеет значения , Инициализировать x до объявления функции (вне ее сферы), чтобы решить эту проблему вы опыт:

var x = 10; 
var test = (function(x) { 
     return x + 2; 
    })(); 
Смежные вопросы