Быстро (надеюсь, легко!) О области видимости с объектами функций в Javascript ... ode> - PullRequest
1 голос
/ 01 февраля 2012

Добрый вечер, коллеги-кодеры, и заранее благодарю за любую помощь / внимание.

Это касается объектов функций JavaScript, когда они объявляются с использованием оператора (не выражения) и добавления к ним свойств.

ЕСЛИ это работает: (что делает!)

function Test(){
     alert( Test.Data );
}

// Define a property on the method.
Test.Data = "Method property";

// Execute the method.
Test();

тогда почему это не работает?

function Test(){
  var Data = "Method property";
  alert( Test.Data );
}

// Execute the method.
Test();

или даже это?

function Test(){
  Data : "Method property";
  alert( Test.Data );
}

// Execute the method.
Test();

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

Спасибо.

Джеймс

Ответы [ 4 ]

2 голосов
/ 01 февраля 2012

Вы можете установить свойство для объекта функции из него. Вы делаете это точно так же, как вы делаете это снаружи:

function Test() {
    Test.Data = "Method property";
    alert(Test.Data);
}

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

тогда почему это не работает?

function Test(){
  var Data = "Method property";
  alert( Test.Data );
}

Поскольку Data в данном случае является просто локальной переменной, а не свойством функции, поэтому Test.Data равно undefined.

или даже это?

function Test(){
  Data : "Method property";
  alert( Test.Data );
}

Потому что Data в данном случае это просто метка . Опять же, это не имеет отношения к каким-либо свойствам, установленным на Test.

0 голосов
/ 01 февраля 2012

Функции являются объектами в javascript и действуют как любой другой объект.Test.Data = "foo" просто добавляет переменную Data к объекту Test и присваивает значение "foo".Сама функция не изменяется.

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

Я полагаю, что это по существу сделает то, что вы пытаетесь сделать в версии 2:

function Test() {
  this.Data = "Method Property";
  alert(this.Data); // Does what you expect
}
var test = new Test();
alert(test.Data); // alerts what you expect
0 голосов
/ 01 февраля 2012

Причина в том, что первые два элемента делают разные вещи, а третий не устанавливает значение - он просто устанавливает неиспользуемую метку.

Элемент 1 создает функцию, которая является типомобъекта, а затем присваивает значение свойству «Данные» для этого объекта.Затем он вызывает функцию, и функция просматривает свойство.

Элемент 2 создает функцию и в рамках выполнения этой функции определяет переменную.Затем он ищет объект, представляющий эту функцию, для свойства с именем «Данные» и не может его найти.

0 голосов
/ 01 февраля 2012

На самом деле это не проблема области, это различие между свойствами объекта и (локальными) переменными.

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

  2. Второй синтаксис создает локальную переменную, которая доступна непосредственно по имени в функции, но это не свойство объекта, поэтому можетне доступны с помощью свойства объекта objectname.propertyname синтаксис.Попробуйте alert(Data);, и он отобразит значение локальной переменной.Или произнесите Test.Data = "something"; внутри функции, и это тоже будет работать.

  3. Третий синтаксис выглядит так, как будто вы пытаетесь использовать синтаксис propertyname : value, который работает внутриобъектные литералы, за исключением того, что у вас нет объектного литерала настолько, что это фактически синтаксис метки.Data : становится меткой, а затем "Method property"; - это утверждение, которое ничего не делает.

...