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

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

输出:

这是对象。

This is Object.

但我期望输出:

这是空值。

这是对象。

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

Obeth Samuel asked 2020-06-29T18:51:41Z
4个解决方案
59 votes

从MDN报价

如果该方法是非严格模式下的函数,则2944720382504504469504和this将替换为全局对象,并将原始值转换为对象。

这就解释了为什么在调用this时会得到一个对象。当此处传递this时,null内部的this将成为全局对象undefined

对于所需的行为,请使用严格模式。

this

引用ES6规范的严格模式

如果在严格模式代码内评估this,则this值不会强制到对象。 thisundefinedthis值未转换为全局对象,并且原始值也未转换为包装器对象。 通过函数调用(包括使用Function.prototype.applyFunction.prototype.call进行的调用)传递的this值不会强制将此值强制传递给对象

Tushar answered 2020-06-29T18:52:20Z
4 votes

“ this”表示什么? 您可以使用 function test(input){ if(input=== null){ console.log("This is null"); }else{ console.log("This is Object"); } } test(null); test({});来了解它。 但是作为答案,请使用输入(在这里我将其称为input)并对其进行测试。

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

Elnaz answered 2020-06-29T18:52:40Z
0 votes

[HTTP://饿死5.GitHub.IO/#小15.3.4.4]

注意thisArg的值未经修改即作为this传递 值。 这是对版本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({});设置为所需的任何内容。 但是请小心,您最终可能会意外引用不需要的内容。

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

Josh Adams answered 2020-06-29T18:53:09Z
0 votes

正如@Tushar在回答中提到的那样:

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,{});将是全局对象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,{});

.

另一方面,您的函数没有参数,正如@Elnaz在她的回答中提到的那样,您可以向其添加参数以从函数内的调用方获取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,{});值 当您使用以下命令调用函数时,通过test.call(this,null)设置参数 test(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,{});

或通过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,{});时:

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,{});

RAM answered 2020-06-29T18:53:51Z
translate from https://stackoverflow.com:/questions/48257590/how-to-set-null-context-in-call-function