2016-01-18 3 views
0

Я новичок в Javascript, поэтому простите мне мои тривиальные ошибки. Я написал следующий скрипт, в котором res предположительно является глобальной переменной в файле сценария. Я устанавливаю глобальный res в методе и затем обращаюсь к нему по другому методу, однако проблема заключается в том, что this.issue возвращает undefined в методе Y, но это не определено в методе X, где я присваиваю ему значение. Почему это?Глобальная переменная, возвращающаяся undefined

Метод X вызывается до метода Y.

var res; 

/* GET home page. */ 
router.get('/', function(req, res, next) { 
    res.render('index', { title: 'Express', shortenedUrl: ''}); 
}); 


router.X('/yolo', jsonParser, function(req, res, next) { 
    this.res = res; 
    console.log("this.res: "+ this.res); // this.res not undefined here 
    Y(); 
}); 

function Y(){ 
    console.log("this.res: "+ this.res); // this.res here becomes undefined 
}); 
+0

потому что в обоих случаях это 'другое' – dfsq

+1

читать [здесь] (http://javascriptissexy.co m/понимать-javascript-closures-with-ease /) о закрытии – puemos

ответ

0

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

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

Я хотел бы предложить:

var res; 

router.X('/yolo', jsonParser, function(req, _res, next) { 
    res = _res; 
    console.log("res: ", res); 
    Y(); 
}); 

function Y(){ 
    console.log("res: ", res); // res will now have the correct value 
}); 

P.S .: Также используйте , вместо + на бревнах консоли, так что консоль выводит полное дерево объектов.

0

Проблема в Javascript заключается в том, что глобальные переменные не могут быть установлены внутри функций с . В вашем случае переменная возвращает undefined, потому что res не был нарушен вне функций. Чтобы решить эту проблему, вы можете использовать

window.res

Это означает, что в вашем коде:

var res; 

/* GET home page. */ 
router.get('/', function(req, res, next) { 
    window.res.render('index', { title: 'Express', shortenedUrl: ''}); 
}); 


router.X('/yolo', jsonParser, function(req, res, next) { 
    window.res = res; 
    console.log("this.res: "+ this.res); 
    Y(); 
}); 

function Y(){ 
    console.log("this.res: "+ window.res); // it becomes no longer undefined 
}); 

PS: Может быть, возможно, что я неправильно interpretet ваш код, но я надеюсь, что это поможет вам решить вашу проблему;)

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