Как назначить свойство глобальной функции изнутри этой функции - PullRequest
0 голосов
/ 08 июня 2018

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

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Краткий ответ: вызовите функцию через 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 голосов
/ 08 июня 2018

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

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

test('hello');
console.log(test.prop); // => "hello"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...