Устраните возможное строгое нарушение (и помогите Бэтмену спасти Готэм)

У меня есть следующий (упрощенный) Batman.js файл:

(function(){
  "use strict";

  window.Batman = function(){
    // Global references
    this.version = "1.0.1";
  };

  Batman.prototype.saveGotham = function(params) {
    var _ = this; // Works fine
    destroyGotham.call(_, params);
  };

  // Private
  function destroyGotham(params){
    var _ = this; // <!-- "possible strict violation"
  }

}());

JSHint жалуется на possible strict violation в указанной строке. Как мне обойти это, не уронив "use strict"?

P.S. Я бы хотел, чтобы проблемный var _ = this ссылался на экземпляр Batman.


person FloatingRock    schedule 17.01.2015    source источник


Ответы (1)


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

Автоматическое упаковывание снижает не только производительность, но и раскрытие глобального объекта в браузерах представляет собой угрозу безопасности, поскольку глобальный объект предоставляет доступ к функциям, которые должны быть ограничены в «безопасной» среде JavaScript.
Таким образом, для функции строгого режима указанный this не помещается в объект, и если он не указан, this по умолчанию будет неопределенным.

Это означает, что используя this таким образом, просто установив его в переменную

var _ = this;

в большинстве случаев приведет к тому, что this будет неопределенным, поэтому jshint говорит, что это "возможное" нарушение, как это было бы, если бы вы не вызывали его с call и не предоставляли это значение.

Игнорируй jshint, то, что ты делаешь, в порядке.

person adeneo    schedule 17.01.2015
comment
И как мне это исправить? - person FloatingRock; 17.01.2015
comment
Вы игнорируете jshint, поскольку вызываете функцию таким образом, что this будет определено, - person adeneo; 17.01.2015
comment
Спасибо. Я узнал, что вы можете добавить /*jshint validthis:true */ в строку над жалобой var _ = this;, чтобы подавить ошибку. - person FloatingRock; 17.01.2015
comment
Да, если вам просто нужно пройти jshint, вы можете пропустить тест this - person adeneo; 17.01.2015
comment
В качестве альтернативы добавьте "validthis": "_" в конфигурацию jshint. - person mcranston18; 26.10.2015