Javascript 确定在非严格模式下是否使用null、未定义或全局对象调用函数

Javascript 确定在非严格模式下是否使用null、未定义或全局对象调用函数,javascript,Javascript,每当使用null/undefined调用非严格模式下的特定函数时,我希望抛出TypeError。通过强制函数在严格模式下本地执行,有一个局部解决方案,但这是一个不完整的解决方案 var t=函数{console.log(this)}; t、 call(null),t.call(未定义);//窗户,窗户 (功能(){ “严格使用”; t=函数{console.log(this)} t、 call(null),t.call(未定义);//null,未定义 })(); 如果此是窗口,我也无法抛出,因

每当使用
null
/
undefined
调用非严格模式下的特定函数时,我希望抛出
TypeError
。通过强制函数在严格模式下本地执行,有一个局部解决方案,但这是一个不完整的解决方案

var t=函数{console.log(this)};
t、 call(null),t.call(未定义);//窗户,窗户
(功能(){
“严格使用”;
t=函数{console.log(this)}
t、 call(null),t.call(未定义);//null,未定义
})();

如果
窗口
,我也无法抛出,因为该函数可以合法地使用
作为全局对象调用。是否有一个不涉及
使用strict
的完整解决方法?

在草率模式函数中不可能获得原始
null
未定义的
此参数。必须以严格模式1包装函数

请注意,调用位置的严格性并不重要,重要的是函数的定义。你想要

函数t(){
“严格使用”;
//  ^^^^^^^^^^^^^
console.log(这个)
};
//在草率模式下调用:
t(),t.call(null),t.call(未定义);//未定义的,空的,未定义的
(功能(){
“严格使用”;
//严格模式下的调用:
t(),t.call(null),t.call(未定义);//未定义,null,未定义

})();
是否可以选择包装函数
t
以生成修改后的函数?例如:
t=wrap(t)
,那么你可以正常使用
t
,除非当你用
null
调用它时它会抛出,或者
undefined
不会
wrap
有与
t
相同的问题吗?也就是说,您无法区分是使用
null
undefined
还是
window
调用它。如果您返回一个修改过的函数,并在调用时执行一些检查,那么您可以更改行为:这非常聪明。也许你应该回答这个问题;-)为什么您不想对该函数使用严格模式呢?我看不出你的解决方案有什么不完善之处。