2015-07-12 7 views
0

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

var specialStuff; // defined globally 

затем некоторые Ajax-код в "myMainObject", который вызывает this.involeSpecialStuff(); если пользователь вошел в систему:

myMainObject.prototype.invokeSpecialStuff = function(){ 
    document.specialStuff = new specialStuff({foo:bar}); 
}); 

В центре внимания мой вопрос о «document.specialStuff» часть, и, если это правильный путь, чтобы получить доступ к глобально предопределенный пустой «specialStuff» переменная, в отличие от "specialStuff = новый specialStuff()", что приводит к "TypeError: не определено не конструктор (оценка«новый specialStuff ({Foo: бар});"

Благодаря

+0

Что вы ожидаете 'новый specialStuff ({Foo: бар}) 'делать? Является конструктором 'specialStuff'? Почему вы пытаетесь присвоить возвращаемое значение 'new' для самого конструктора? – user2357112

+0

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

+0

Является ли specialStuff constuctor? потому что, если это не так, вы не должны использовать null. Если это конструктор, тогда вы должны иметь возможность делать «specialStuff = new specialStuff()» – qzcx

ответ

1

Учитывая объяснение вы дали и specialStuff является глобальной вар, который ссылается на функцию (класс), Вы не можете сделать specialStuff = new specialStuff();, так как вы перекрывая то же значение с новым экземпляром из specialStuff класса. Он будет работать в первый раз, но в следующий раз он действительно инициирует упомянутую вами ошибку.

Вам не нужно использовать document.specialStuff (хотя он работает). Вы можете просто использовать другую переменную для него следующим образом:

myMainObject.prototype.invokeSpecialStuff = function(){ 
    var mySpecialStuff = new specialStuff({foo:bar}); 
}); 

EDIT:

Это может быть полный пример:

// Defining you class in 'global context' 
// Since it is called as a constructor below, it should be a function 
var specialSuff = function(args){ 
    // Do your constructor stuff here 
}; 

// Defining a variable which is going to hold an instance of specialStuff 
var mySpecialStuff; 

myMainObject.prototype.invokeSpecialStuff = function(){ 
    // Creating an instance of specialStuff 
    mySpecialStuff = new specialStuff({foo:bar}); 
}); 
+0

Но тогда mySpecialStuff будет существовать только в области myMainObject, не так ли? –

+0

' var' сделает его локальной переменной в содержащей функции, поэтому 'mySpecialStuff' будет существовать только в области текущего вызова функции' invokeSpecialStuff'. – nnnnnn

+0

Да, но вы можете сделать его глобальным как «specialStuff» –

0

вы не должны" t нужна часть документа для хранения глобальной переменной в javascript. Вероятно, лучше всего сделать

specialStuff = new specialStuff({foo:bar}); 

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

+0

Я пробовал это сначала, но, как сказано, это вызывает ошибка: TypeError: undefined не является конструктором (оценка «new ... –

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