2012-02-01 3 views
1

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

Я правильно думаю, что arguments.callee делает это?

Есть ли другие способы установить эти поля?

Как можно установить field в первом случае?

function something1() { 
    arguments.callee.field = 12; 
} 

alert(something1.field); // will show undefined 
something1(); 
alert(something1.filed); // will show 12 

something2 = function() { 
    arguments.callee.field = 12; 
}; 

alert(something2.field); // will show undefined 
something2(); 
alert(something2.field); // will show 12 

UPDATE 1

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

ответ

1

Вам не нужно использовать arguments.callee для обозначения функции, которая имеет имя; вы можете просто использовать имя. Это естественно, когда вы заявляете функцию с использованием

function name(...) { ... } 

синтаксис; но даже в выражении функции, вы позволили поставить временное имя:

(function temp_name(...) { ... })(arg); 

Итак, если вы хотите, чтобы установить свойство из внутри функции, вы можете написать:

function something1() { 
    something1.field = 12; 
} 

alert(something1.field); // will show undefined 
something1(); 
alert(something1.field); // will show 12 

something2 = function something2() { // note the second "something2" 
    something2.field = 12; 
}; 

alert(something2.field); // will show undefined 
something2(); 
alert(something2.field); // will show 12 
+0

Могу ли я написать 'something2 = function something3() {...};' и какая разница между двумя именами? – Dims

+1

@ Dims: Да, вы можете. Разница в том, что имя 'something3' является локальным для функции, тогда как имя' something2' будет иметь любую внешнюю область, которую вы ожидаете. Так, например, вы можете написать «var f = function g() {alert (g); }; оповещение (е); f(); '- с' g' используется внутри функции, а 'f' используется впоследствии. – ruakh

0

Простой

function something1() {}; 
something1.Property = "Foo"; 

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

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

То же самое внутри функции

function something1() { 
    something1.AnotherProp = "Bar"; 
}; 
something1.Property = "Foo"; 
+0

Я имел в виду изнутри функции. – Dims

1

Вот как я бы это сделать:

function something1() { 
    this.field = 12; 
} 

var test = new something1(); 

alert(test.field); // alerts "12" 
test.field = 42; 
alert(test.field); // alerts "42" 

Если вы собираетесь рассматривать его как класс, вы необходимо создать новый экземпляр, прежде чем вы сможете получить доступ к его полям.

JSFiddle

+0

Спасибо, но эта вещь, которую я уже знаю. – Dims

1

Я правильно думаю, что arguments.callee делает это?

Да, это так, но теперь они deprecated.

Есть ли другие способы установить эти поля?

Официальный способ заменить callee это использовать явное имя функции, как и в funcName.propertyName=.... Это, однако, не всегда удобно, например, с динамически сгенерированными функциями. Чтобы процитировать John Resig, we're going to miss arguments.callee, это было очень полезно для конкретных задач.

Смежные вопросы