Как назначить свойство глобальной функции изнутри этой функции

1

Предполагая, что функции в javascript являются объектами, как я могу назначить свойства этому объекту функции внутри самой функции.

Ниже не работает ключевое слово "this", ссылающееся на объект окна, поэтому "prop" будет присвоен глобальному объекту окна не объекту функции.

function test() {
    this.prop = value;
}

Почему это ключевое слово внутри глобальных функций относится к объекту окна и не относится к самому объекту функции?

Редактировать:

Мой вопрос отличается от повторяющегося вопроса, поскольку я задаю вопрос о том, как назначить свойство глобальной функции внутри этой функции, а не области переменных.

  • 0
    Могу ли я спросить, что вы пытаетесь решить в конце концов?
  • 0
    Возможные дубликаты области действия переменных в JavaScript?
Показать ещё 4 комментария
Теги:
object
function

2 ответа

2
Лучший ответ

Ссылка на функцию по имени:

function test(value) {
  test.prop = value;
}

test('hello');
console.log(test.prop); // => "hello"
0

Короткий ответ: вызовите функцию с помощью call и передать предполагаемое this в качестве первого аргумента.

function test(value) {
  this.prop = value
}

//  'this' v     v value
test.call(test, 10)
console.log(test.prop) // 10

Цель call - явно установить this функцию вызываемой функции.

Объяснение:

Для нестрогого режима, когда функция вызывается без вызывающей, например, test(10), this неявно устанавливается на глобальный объект, в этом случае window. В строгом режиме он не будет undefined.

function test() {
  return this
}

console.log(test()) // window (or undefined in strict mode)

Внутри функции this относится к вызывающей функции.

const caller = {
    test: function () { return this }
}

console.log(caller.test()) // caller, i.e., { test: function() {...} }

Это относится и к "классам" (функции, вызываемые new).

function MyConstructor() {
  this.test = function() {
    return this
  }
}

const instance = new MyConstructor()
console.log(instance.test()) // instance of MyConstructor

В зависимости от вашего варианта использования может быть предпочтительнее использовать эту форму:

const myObj = {
  test: function(value) {
    this.prop = value
  }
}

// 'prop' will be set on 'myObj' instead of the function.
myObj.test(10)
console.log(myObj) // { prop: 10, test: function(value) {...} }

или класс-подобную конструкцию:

function MyConstructor(value) {
  this.prop = value
}

const instance = new MyConstructor(10)
console.log(instance) // MyConstructor { prop: 10 }
console.log(instance.prop) // 10
  • 0
    Хотя это на самом деле правильно, это не то, что следует использовать.
  • 0
    @ Берджи, это четкий и правильный ответ, который дает пользователю объяснение прямо в соответствии с сутью его вопроса и объясняет наблюдаемое поведение несколькими примерами. Я не делаю никаких оценочных суждений о его использовании. Решение о том, что следует использовать, является, по крайней мере, частично субъективным и будет основываться на деталях, не указанных в формулировке вопроса. Настройка вызывающего абонента через call вполне адекватна и фактически помогает продемонстрировать поведение this в контексте вопроса.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню