#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
})();