2014-02-12 2 views
-1
for(i=0; i< 3; i++){ 
    (function(i){ 
     console.log(i) 
    })(i); 
} 

Я столкнулся с этим и было интересно, как это работает (я понял результат, просто хочу немного более глубокое объяснение на (function(i){})(i) и то, что это называется. спасибо много !!!Javascript странное поведение требуется объяснение

+0

Это IIFE: http://benalman.com/news/2010/11/immediately-invoked-function-expression/ –

+1

Возможный дубликат [Что означает этот фрагмент JavaScript?] (Http://stackoverflow.com/questions/6771406/what-do-this-javascript-snippet-mean) –

+0

и [Как работает анонимная функция в JavaScript?] (http://stackoverflow.com/q/1140089/218196) –

ответ

1

Часть кода:

(function(i){ 
    console.log(i) 
})(i); 

является то, что известно как IIFE (немедленно вызываемое выражение функции) ,

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

var log = function(i) { 
    console.log(i); 
} 

for(var i=0; i<3; i++){ 
    log(i); 
} 

В этом примере я хранить функцию в качестве переменной, а затем назвал его помощью оператора вызов функции ()

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

0
(function(i){})(i) 

Это self executing function. они автоматически оцениваются рядными для возврата значения. Это хорошая особенность Javascript, что он платит, чтобы понять. Вы можете использовать их таким образом, но они действительно хороши для создания Javascript Modules, что сфера применения и расширить код .

+0

* «Они автоматически вычисляются inline для возврата значения». * Я не уверен, что вы подразумеваете под «для возврата значения». –

0

Для каждой итерации цикла вы создаете и сразу вызываете анонимную функцию с тем, что значение i находится во время этой конкретной итерации.

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

1
(function(i){ 
    console.log(i) 
})(i); 

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

/* self-executing anonymous function definition */ 
( function(i){ 
     console.log(i) 
    }  
) 

/* pass argument i into the anonymous function and execute */ 
(i); 

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

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

(function(i){ 
    console.log(i) // prints '5' 
})(5); 
Смежные вопросы