#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
, и это заставит функцию вести себя в соответствии со строгими правилами режима.