2016-07-23 4 views
1

В следующем коде: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, по-видимому, подразумевает, что обратный вызов вызывается из тестовой функции.

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

Я думаю, мой вопрос:

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

+0

Вы когда-нибудь слышали о замыканиях в JavaScript? –

+0

Область действия функции основана на том, где она * объявлена ​​*, а не там, откуда она вызывается. Функция 'this' не связана с областью действия и основана на * как * функция вызывается. – nnnnnn

+0

@RajaprabhuAravindasamy. Таким образом, обратный вызов имеет закрытие теста? –

ответ

1

Как функция обратного вызова обрабатывается с точки зрения определения, а затем вызывает вызов при рассмотрении области видимости и контекста выполнения?

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

Объяснение: обратного вызова лексически присутствует в тесте функции(), поэтому он всегда будет пытаться найти значение этого либо внутри себя (если они присутствуют) в противном случае он будет видеть свое значение во внешней среде (что тест функции в данном случае)

Функция и Функция LogCb будет следовать той же практике. В этом случае внешняя среда будет глобальной

как делает двигатель следить за рамки отдельно выполнения контекста?

лексического Окружающая среда: Где-то сидит физически в коде вы пишете.

Контекст выполнения: Обертка, помогающая управлять запущенным кодом.

Теперь в вашем коде есть много лексических сред. Который в настоящее время управляется через контексты выполнения. Он может содержать вещи, помимо того, что вы написали в коде.

Всякий раз, когда создается контекст выполнения у нас есть три вещи, которые доступны нам:

  1. Глобальный объект (окно): Любая переменная или функция в глобальном масштабе связан с объектом окна
  2. «это»
  3. Внешняя среда

так в зависимости от исполнения контекста в данный момент, эти вещи будут изменяться в соответствии с которой он физически или лексически присутствует в коде. Например, внешняя среда для cb является function test()

+0

Как движок отслеживает область действия отдельно для контекста выполнения? –

1

Scope определяется, где функция создана, а не где он называется.

Функция, которую вы передаете logCb, создана внутри test, поэтому имеет доступ к области test.

+0

Знаете ли вы хороший способ объяснить, как работает движок Google V8? –

1

Когда функция вызывается в javascript, ей передается контекст.

Контекст может быть один из следующих способов

  1. используя новый, объект темп создается и передается в качестве контекста функции

  2. вызывающей функции с помощью объекта a.getValue (). ПолучитьЗначение получает контекст

  3. , если ни один из выше 2 не пройдет глобальный то есть окно объекта

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