В следующем коде:Javascript: почему функции обратного вызова с глобальным контекстом выполнения имеют доступ к облачным переменным?
function test() {
var x = 5 // scoped to test function
console.log(this); // global object
logCb(function(){
console.log(this); // global object
console.log(x);
})
}
function logCb (cb) {
console.log(this); // global object
cb() // This still seems to execute within the test function scope? why...
}
test()
х областью действия, чтобы проверить, и это, где функция обратного вызова определена. Я бы ожидал строки cb()
, чтобы выбросить ошибку, так как функция logCb() не имеет доступа к переменной x.
Однако это не так. Зачем? Кажется, что ссылки в обратном вызове создаются во время назначения, а НЕ во время выполнения - что, я думаю, имеет смысл, если вы рассматриваете подъем, то есть во время компиляции, функция обратного вызова поднимается до вершины «теста», а затем назначение происходит в тесте объем?
Я прочитал, что выполнение не совпадает с объемом. В этой статье: http://ryanmorr.com/understanding-scope-and-context-in-javascript/, это предложение scope pertains to the variable access of a function when it is invoked and is unique to each invocation
, по-видимому, подразумевает, что обратный вызов вызывается из тестовой функции.
Поскольку мне кажется, что независимо от того, где вызывается функция обратного вызова, все равно будет проверяться.
Я думаю, мой вопрос:
Как функция обратного вызова обрабатываются с точки зрения определения, а затем вызов, когда речь идет о сфере деятельности и выполнения контекста?
Вы когда-нибудь слышали о замыканиях в JavaScript? –
Область действия функции основана на том, где она * объявлена *, а не там, откуда она вызывается. Функция 'this' не связана с областью действия и основана на * как * функция вызывается. – nnnnnn
@RajaprabhuAravindasamy. Таким образом, обратный вызов имеет закрытие теста? –