function test(){
if(this === null){
console.log("This is null");
}else{
console.log("This is Object");
}
}
test.call(null);
test.call({});
输出:
这是对象。
这是对象。
但我希望输出:
这是空的。
这是对象。
为什么Null没有在上下文中设置?
答案 0 :(得分:59)
引自MDN
如果方法是非严格模式的函数,
null
和undefined
将被全局对象替换,原始值将转换为对象。
这解释了当您致电test.call(null);
时获得对象的原因。在此处传递null
时,this
内的test()
将成为全局对象Window
。
对于所需的行为,请使用严格模式。
function test() {
"use strict";
if (this === null) {
console.log("This is null");
} else {
console.log("This is Object");
}
}
test.call(null);
test.call({});
的ES6规范
如果在严格模式代码中评估
this
,则this
值不会强制转换为对象。this
值null
或undefined
未转换为全局对象,并且原始值不会转换为包装器对象。通过函数调用传递的this
值(包括使用Function.prototype.apply
和Function.prototype.call
进行的调用)不会强制将此值传递给对象
答案 1 :(得分:4)
'这是什么'表明?您可以使用console.log(this);
来了解它。但作为回答,使用输入(这里我称之为input
)并测试它。
function test(input){
if(input=== null){
console.log("This is null");
}else{
console.log("This is Object");
}
}
test(null);
test({});

答案 2 :(得分:0)
http://es5.github.io/#x15.3.4.4
注意thisArg值未经修改就会传递 值。这是对版本3的更改,其中未定义或为null thisArg将替换为全局对象并应用ToObject 所有其他值和结果将作为此值传递。
在您的情况下,您没有处于严格模式,如果您设置严格模式,this
可以设置为您想要的任何内容。但要小心,你最终可能会偶然引用你不想要的东西。
//global object being set, since this can't be null
function test(){
if(this === null){
console.log("This is null");
}else{
console.log("This is Object");
}
}
test.call(null);
test.call({});
//example of strict returning null
function test2(){
"use strict";
if(this === null){
console.log("This is null");
}else{
console.log("This is Object");
}
}
test2.call(null);
test2.call({});
答案 3 :(得分:0)
在他的回答中提及 @Tushar :
this
内的{p>test()
将是全局对象Window
另一方面,你的函数没有参数,并且在她的回答中提到 @Elnaz 你可以为它添加一个参数来从调用者里面获取null功能,我想添加这个注释:
此外,您可以在函数的输出中获得
null
值 使用时调用函数时arguments[0]
的参数test(null)
function test(){
input=arguments[0];
if(input === null){
console.log("This is null");
}else{
console.log("This is Object");
}
}
test(null);
test({});

或arguments[1]
时通过test.call(this,null)
调用function test(){
input=arguments[0];
if(input === null){
console.log("This is null");
}else{
console.log("This is Object");
}
}
test.call(this,null);
test.call(this,{});
:
SELECT * FROM sys.firewall_rules