Настоящая проблема здесь заключается в том, что если вы позвоните privFn
из контекста модуля (из IIFE ), this
будет undefined
в строгом режиме; window
если не в строгом режиме. Увы, эта функция потерпит неудачу, если будет вызвана из IIFE.
Это связано с тем, что функции не имеют владельца (объекта) при вызове изнутри IIFE, тогда как возвращенный объект модуля является владельцем функций при их вызове извне контекст IIFE, например this === myModule
при звонке myModule.pubFn()
.
И строгий режим, и JSHint / JSLint пытаются вам помочь, и вам никогда не следует просто игнорировать сгенерированные ими ошибки / предупреждения, а вместо этого выяснить, почему они вас предупреждают.
Если вы на 100 процентов уверены, что privFn
, pubFn
и т. Д. Не будут вызываться нигде, кроме вашего модуля, просто добавьте комментарий /*jshint validthis: true */
в любые функции, которые генерируют предупреждение. В качестве альтернативы, один комментарий в IIFE не позволит JSHint генерировать эту ошибку для любой функции внутри модуля.
Одно из многих возможных решений
Сохраните область действия this
(в этом примере self
) для явной ссылки на модуль. Это покажет и обеспечит ваши намерения.
/*jshint strict: true */
var myModule = (function() {
"use strict";
var privVar = true,
pubVar = false,
self = this;
function privFn() {
return self.test;
}
function pubFn() {
self.test = 'public';
//privFn.call(this); // Will have no effect, as `privFn` does not reference `this`
privFn();
}
return {
pubVar: pubVar,
pubFn: pubFn
};
}());
myModule.pubFn();