2010-12-28 3 views
1

Почему-то я думал, что вы можете определить функцию как глобальную переменную и получить доступ к ее внутренним переменным. Пример:Доступ к глобальным функциональным переменным в Javascript

var func = function(){ 
    var connected = true; 
} 

console.log(func.connected); 

Тем не менее, это все еще идет вверх, как "неопределенный". Я думал, что было бы интересно «namespace» некоторые переменные вроде этого.

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

+1

Так что, если вы можете 'delete' их? Вы также можете удалить что-нибудь еще. – SLaks

+0

'Я не хочу использовать объекты, потому что вы можете удалить эти элементы. Извините, что разочаровал вас, но функции тоже являются объектами:' delete func'. На самом деле все в javascript - это объекты. – slebetman

+0

Да, но вы не можете удалить переменную, которая была объявлена ​​с помощью 'var' – skerit

ответ

2

Это невозможно.
На самом деле, это даже не имеет смысла.
Каждый вызов функции создает отдельный набор локальных переменных.

Вы должны использовать объекты для создания пространств имен, даже если вы можете их использовать delete.

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

function MyClass() { 
    this.connected = true; 
} 

var myInstance = new MyClass(); 
console.log(myInstance.connected); 

Однако, вы не должны использовать классы для создания одноэлементных пространств имен ; Бессысленно.

Вместо этого вы должны написать

var myNamespace = { connected: true }; 

console.log(myNamespace.connected); 
1

с помощью var он является частным.

использовать его как это:

var func = function(){ 
    this.connected = true; 
} 
var namespace = new func(); 

console.log(namespace.connected); 

помнить, что он должен быть создан.

+1

Справа, забыл, что ее необходимо создать ... –

2

var внутри функции делает его закрытым. используйте this.connected = true, чтобы сделать его общедоступным.

var func = function(){ 
    this.connected = true; 
} 

PS - Насколько я знаю, все свойства объекта являются файлом удаляемыми, если они не несчетные, которые я не думаю, что вы можете легко определить. Вы должны использовать this.connected, хотя его можно удалить.

Существует хорошее чтение here по общедоступным методам и «привилегированным» методам.

EDIT: Я предположил, что вы знали о создании экземпляра .. в любом случае просто сделайте x = new func, чтобы создать экземпляр, затем x.connected.

+0

Это не сработает. – SLaks

+0

@SLaks - что не получится? Я уже указал о 'delete'. И подразумевается его использование «нового». –

+1

Почему вы думаете, что подразумевается «новый»? – SLaks

0

Вы можете использовать JSON обозначения, как это:

var func = { 
    connected:true, 
    func:function(){ 
    func.connected = true; 
    } 
} 
console.log(func.connected); 
+0

@Slaks: Почему? – Luis

+0

Ваша вторая версия будет работать, но слишком много «func's. Вам нужны разные имена. – SLaks

+0

Что значит слишком много func s? И зачем вам нужны разные имена? для чего? JSON идеально подходит для создания синглтонов и пространств имен ваших переменных и функций. – Luis

0
var MyClass = function() { 
    function clazz() { 
     this.message = "Hello"; //instance variable 
    } 

    clazz.connected = true; //static variable 

    return clazz; 
}(); 


alert(MyClass.connected) 
alert(new MyClass().message) 
+0

, почему он не будет работать правильно? и в этом случае он потерпит неудачу? –

+0

Извините; Я неправильно понял. – SLaks

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