Строка JavaScript отображается как объект при использовании вызова, и это

#javascript

Вопрос:

 var d = {};
d.a = 'myString';
d.b = function(a) {
    console.log(this);
}

d.b.call(d.a); 

В приведенном выше коде, почему «myString» отображается как an object , когда он вошел в консоль?

Даже typeof показывает, что это ан object . И с каждым разделением алфавита.

Я пытался сделать

 arr = ['myString','foo','bar']
console.log(arr.includes(this));
 

и это также возвращает значение false. Как я могу получить его в виде строки при использовании this ?

введите описание изображения здесь

Комментарии:

1. Работает в JS fiddle для меня

Ответ №1:

Это связано с тем, что ваш сценарий выполняется в нестрогом режиме. Если вы добавите «использовать строго», то это будет работать так, как вы ожидаете:

 "use strict";

let d = {
    a: 'myString',
    b: function(a) {
        console.log(this);
    }
};

d.b.call(d.a); 

Причина в том, что до ES6 this всегда был объектом. Любой примитив будет преобразован в объект. Это все еще поведение, если вы не работаете в строгом режиме.

Если невозможно перевести весь ваш скрипт в строгий режим, просто примените его к функции:

 let d = {
    a: 'myString',
    b: function(a) {
        "use strict";
        console.log(this);
    }
};

d.b.call(d.a); 

Комментарии:

1. Это решило проблему. Тем не менее, я вижу, что размещение «использовать строго» в начале страницы потребует от меня внесения множества изменений. Я надеюсь, что тогда можно будет использовать его на функциональном уровне.

2. Да, вы можете использовать "use strict" в качестве первой строки в теле функции b , и это заставит функцию вести себя в соответствии со строгими правилами режима.