Как установить нулевой контекст в функции вызова?
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({});