2015-08-18 2 views
-3

Может ли кто-нибудь указать на простой пример, чтобы понять закрытие в деталях?Простой пример для закрытия

нижеследующая ссылка http://www.kirupa.com/html5/closures_in_javascript.htm неясно.

Спасибо.

+0

Как насчет [MDN - закрытие] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures). – fuyushimoya

+1

Возможно, вы хотите объяснить, что именно не ясно. – Grmpfhmbl

+0

http://stackoverflow.com/questions/111102/how-do-javascript-closures-work – epascarello

ответ

0

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

var noun = 'Governor'; 

var foo = (function() { 
    var bar = 'Hello'; 
    // A 
    return function() { 
     var baz = 'Blake'; 
     console.log(bar, noun, baz); 
     // B 
    }; 
}()); 
// C 
foo(); 
  • На линии A, что идентификаторы referencable? noun, foo, bar
  • В строка B, какие идентификаторы являются ссылочными? noun, foo, bar, baz
  • В линии С, что идентификаторы referencable? noun, foo

Теперь переходим на думать, если только noun, foo являются Referenceable на линии C, почему значения bar и baz появляются, когда мы foo()? Более конкретно, почему bar все еще там? Он даже не определен в функции, которую мы назначили как foo.

// remember, `foo` looks like this (log it to check for yourself) 
function() { 
    var baz = 'Blake'; 
    console.log(bar, noun, baz); // `bar` used but _not defined here_ 
    // B 
} 

Это потому, что foo является закрытие. Есть идентификаторы «завернутый» внутри него, которые продолжают жить дальше, пока foo живет.

0

A Закрытие - это функция, которая использует ссылки из областей более высокого уровня.

Например:

// Sorrounding scope 
var a = "hello world"; 

var func = function() { 
    // Function scope 
    var b = a + " !!!!"; 
}; 

См Closure (computer programming) on Wikipedia, чтобы узнать больше о том, что это замыкание в глубину.

0

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

(function(){ 
    var number = 0; 
    window.count = function(){ 
     number = number + 1; 
     console.log(number); 
    }; 
})() 

count(); 
// 1 

count(); 
// 2 

console.log(number); 
// number is not defined 
Смежные вопросы