Показать сообщение отдельно
  #6 (permalink)  
Старый 08.08.2015, 19:50
Профессор
Посмотреть профиль Найти все сообщения от javaQest
 
Регистрация: 07.08.2015
Сообщений: 154

Сообщение от EmperioAf
Но я на самом деле хотел сказать о модулях:
Ну, модули, это не совсем часть языка, скорей, вариант реализации.

Сообщение от EmperioAf
;(function(){
// some code
    return result;
}());
На этом многие новички спотыкаются. Это делается для инкапсуляции данных. У Вас, при таком вызове, создается замыкание, и все переменные, объявленные через var, будут видимы только внутри ф-ций, созданных в данном окружении.

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

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

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

f=function(){
  var x=1
  return function(){alert(x)}
}()

//то же самое, что

o={
 x: 1,
 f: function(){alert(this.x)}
}

f()
o.f()

за исключением инкапсуляции(в плохом смысле).

Последний раз редактировалось javaQest, 08.08.2015 в 19:52.
Ответить с цитированием