2016-08-06 2 views
0

я видел картину очень часто, я наткнулся на эту строку кодаЧто нужно для передачи «этого» в качестве параметра для глобального - IIFE?

https://github.com/addyosmani/timing.js/blob/master/timing.js#L122

(function(window) { 
... 
})(this); // <-- this 

Я всегда думаю, что это является излишним. Нужно ли передавать «это» в ИФДЭ?

+1

Так что, если вы переопределены '' window' как вар окна = Foo', он будет работать. – 4castle

+0

Поступая таким образом, вы убедитесь, что если объект 'window' был перезаписан, он возвращается обратно в' window'. – Redu

ответ

1

Передавая это значение, вы явно устанавливаете параметр window для локализации в области видимости.

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

0

Есть несколько причин, в том числе, но не ограничиваясь:

  • лучше минификация (function(a){...})(window)
  • локальные переменные, кажется, быть быстрее при решении (ничтожное)
  • Interop с nodejs где window не есть, но global делает
  • redefined window глобальная переменная проблема (как указано @ 4castle)
0

В связанном коде IIFE является strict mode функцией - и это вызов произойдет вне строгих правил - так this делает аргумент имени window всегда ссылается на глобальный объект, независимо от окружающей среды (Node.js использовать global вместо window).

В некоторых старых браузерах разрешено shadow глобальная собственность window, поэтому доступ к window может привести к неожиданностям.

0

Каждая функция имеет свой собственный контекст this. Он не будет автоматически наследовать от родителя, если только вы не передадите его в качестве аргумента или не используете Function.prototype.bind() (далее здесь https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind).

Для этого примера кажется, что это не имеет большого значения, поскольку window является глобальным, но на самом деле полезно обеспечить, чтобы IIFE не использовал глобальные переменные, и вы также можете передавать разные контексты, скажем, если вы пишете модульные тесты и хотите высмеять window, чтобы вы передали поддельный объект, представляющий window.

Тем не менее ваш пример будет работать в Node.js, так как нет window глобального объекта, но this будет оценивать в корневой объект

0

Пропустив this вы можете контролировать объект и его свойства, которые вы код может доступ. По умолчанию this будет отображать объект window, чтобы вы могли получить доступ к его свойствам. Но вы также можете вызвать этот код из другого функционального контекста с аналогичными свойствами, и код будет работать, что даст вам больше гибкости.

0

с глобальным и объемом в виде

моей точка зрения

  • this глобальный объект для браузера window когда между <script></script>
  • f{b{}} является экспресс разных масштабов и this примет свою роль
  • Проходной объект окна является изоляцией от загрязнения
  • передавая это как окно неустройство для других (людей и код) вместо того, чтобы передать window непосредственно

(function(window){}(window))