const obj = {
name: "sri1",
func1: function() { // <-- 1
const name = "sri2"
function a() { // <-- 2
console.log(this.name)
}
a();
}
}
Обычно this
указывает на объект window
браузера. Но внутри объекта, если мы определяем свойство с помощью анонимной функции, тогда this
указывает на сам объект. Но другая функция внутри функции? Нет, он указывает на объект window
.
Итак, для вашего примера. Я пометил ваш код двумя ссылочными точками в комментариях.
- Функция Mark 1, это функция свойства объекта. Таким образом,
this
указывает на объект obj
. - Функция Mark 2, она внутри функции mark 1, теперь
this
внутри функции a()
указывает на объект window
. ( Если вы мне не верите, проверьте это с помощью console.log(this)
внутри function a()
)
Как я могу получить this
объекта во внутренней функции ?
Есть несколько способов добиться этого. Я упоминаю о некоторых из них.
Использование arrow function
.
Функция стрелки не изменяет ссылку на указатель this
. Он указывает на блоки this
, в которых лежит функция.
const obj = {
name: "sri1",
func1: function() {
const name = "sri2"
const a = () => { // Using arrow function
console.log(this.name)
}
a();
}
}
Сохранение предыдущего this
в переменной.
Вы можете поместить this
в переменную скажем, that
, затем получите доступ к значению, используя that.name
.
const obj = {
name: "sri1",
func1: function() {
const name = "sri2"
const that = this; // Put this into that
function a() {
console.log(that.name); // Access the name using that.name
}
a();
}
}
Bind this
при вызове функции.
Вы можете связать this
с помощью функции использовать внутри него.
const obj = {
name: "sri1",
func1: function() {
const name = "sri2"
function a() {
console.log(this.name)
}
const withThis = a.bind(this); // Make a function reference with `this` bindings
withThis(); // Call the function
}
}
Использование call()
или apply()
Метод call()
вызывает функцию с заданным значением и аргументами, предоставляемыми> индивидуально.
Хотя синтаксис этой функции почти идентичен синтаксису apply()
, принципиальное отличие состоит в том, что call()
принимает список аргументов, а apply()
принимает один массив аргументов.
const obj = {
name: "sri1",
func1: function() {
const name = "sri2"
function a() {
console.log(this.name)
}
a.call(this); // call() binds the `this`
// Or
a.apply(this); // apply() also binds the `this`
}
}