Как установить нулевой контекст в функции вызова?

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

Выход:

Это объект.

Это объект.

Но я ожидаю Результат:

Это Null.

Это объект.

Почему Null не задан в контексте?

Ответ 1

Цитирование из 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({});

Ответ 2

Что означает "это"? вы можете использовать console.log(this); знать это. Но в качестве ответа используйте вход (здесь я назвал его input) и протестируем его.

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

Ответ 3

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

Ответ 4

Как сказал в своем ответе @Tushar:

this внутренний test() будет глобальным объектом Window

,

С другой стороны, ваша функция не имеет аргументов, и, как упоминал @Elnaz в своем ответе, вы можете добавить к ней аргумент, чтобы получить нуль от вызывающего внутри функции, и я хочу добавить эту заметку:

Также вы можете получить 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({});