Определяет, вызывается ли функция с null, undefined или глобальным объектом в нестрогом режиме

#javascript

#javascript

Вопрос:

Я хочу использовать a TypeError всякий раз, когда определенная функция в нестрогом режиме вызывается с null помощью / undefined . Существует частичный обходной путь, заставляя функцию локально выполняться в строгом режиме, но это неполное решение.

 var t = function(s) { console.log(this) };
t.call(null), t.call(undefined); // window, window

(function() {
    "use strict";
    t = function(s) { console.log(this) }

    t.call(null), t.call(undefined); // null, undefined
})();
  

Я также не могу выбросить if this is window , поскольку функция может быть законно вызвана в this качестве глобального объекта. Существует ли полное обходное решение, не включающее use strict ?

Комментарии:

1. Можно ли обернуть функцию t для создания измененной функции? Например: t = wrap(t) , тогда вы можете использовать t нормально, за исключением того, что он будет выдавать, когда вы вызываете его с null помощью или undefined

2. Не wrap было бы тех же проблем, t что и? То есть вы не можете отличить, была ли она вызвана с null помощью , undefined , или window .

3. Если вы возвращаете измененную функцию с некоторыми проверками при вызове call , вы можете изменить поведение: jsfiddle.net/cpn1dh8t

4. Это довольно умно. Возможно, вам следует сделать это ответом 😉

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

Ответ №1:

Невозможно получить исходный null или undefined thisArgument в функции неаккуратного режима. Вы должны обернуть свою функцию в строгий режим.

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

 function t() {
    "use strict";
//  ^^^^^^^^^^^^^
    console.log(this)
};

// calls in sloppy mode:
t(), t.call(null), t.call(undefined); // undefined, null, undefined

(function() {
    "use strict";
    // calls in strict mode:
    t(), t.call(null), t.call(undefined); // undefined, null, undefined
})();