如何在调用函数中设置空上下文?

时间:2018-01-15 05:51:45

标签: javascript jquery

function test(){         
     if(this === null){
        console.log("This is null");
     }else{
         console.log("This is Object");
     }
 }
test.call(null);
test.call({});

输出:

  

这是对象。

     

这是对象。

但我希望输出:

  

这是空的。

     

这是对象。

为什么Null没有在上下文中设置?

4 个答案:

答案 0 :(得分:59)

引自MDN

  

如果方法是非严格模式的函数,nullundefined将被全局对象替换,原始值将转换为对象。

这解释了当您致电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({});

引用strict mode

的ES6规范
  

如果在严格模式代码中评估this,则this值不会强制转换为对象。 thisnullundefined未转换为全局对象,并且原始值不会转换为包装器对象。通过函数调用传递的this值(包括使用Function.prototype.applyFunction.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