2016-10-15 3 views
3

Я читаю темы о контексте выполнения и объема javascript.Below простой код:переменная разница между областью видимости функции Javascript

var scope="global"; 
    function t(){ 
     alert(scope); // alert :"undefined" 
     var scope="local" ; 
     alert(scope); // alert: "local" 
    } 
    t(); 

Если удалить "вар сфера =„локальный“; ', он становится этим:

var scope="global"; 
function t(){ 
    alert(scope); // alert :"global" 
} 
t(); 

Я не понимаю, почему значение объема изменяется на „глобальный“ во втором случае после того, как я удаляю вар сфера = „локальный“ в функции г ().

Может кто-то помочь объяснить это, спасибо!

+0

Вы понимаете, почему кулак '' alert' показывает undefined' в первом примере? –

+0

@ DiegoCardoso Я действительно не понимаю. Разум, проводя ссылку на пример, пожалуйста? –

+2

@RobScott Это из-за подъема. Любая переменная, определенная внутри функции, поднимается в начало этой функции. Таким образом, в этом случае он переопределяет одну и ту же переменную, но в первой строке «scope» еще не инициализируется. Вы можете взглянуть на ссылку в ответе @ Тима. –

ответ

2

По существу, в вашем первом примере область scope (т. Е. Переменная, объявленная внутри функции) является всем телом функции t. Он не имеет значения, пока не дойдет до строки var scope == ..., но он определен с самого начала.

Таким образом, alert(scope) разрешает «область действия» как локально определенную переменную, которая еще не имеет значения, то есть undefined.

Смотрите этот вопрос

The benefits of declaring variables at the top of the function body in JavaScript

для более подробного объяснения.

+0

спасибо большое, я могу понять сейчас! –

0
var scope="global"; 
function t(){ 
    // you redefine variable scope here 
    // so, the global one is not visible. 

    alert(scope); // alert :"undefined" 
    alert(window.scope); //alert: "global" 
    var scope="local" ; 
    alert(scope); // alert: "local" 
} 
t(); 
3

Когда вы сделаете это:

scope = 'global' 
function t() { 
    alert(scope) // undefined 
    var scope = 'func' 
    alert(scope) // func 
} 
t() 

на линии var scope..., вы рассказывающие ЯШ: остерегаться, я определяю 'сферу' в этой функции. Таким образом, JS сбрасывает значение (не определено). Это как если бы вы сделали:

scope = 'global' 
function t() { 
    var scope; // erase previous 'scope', so it is now undefined 
    alert(scope) // undefined 
    scope = 'func' 
    alert(scope) // func 
} 
t() 

Но если вы просто сделать

scope = 'global' 
function t() { 
    alert(scope) // global 
} 
t() 

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

Надеюсь, вы его получите ... Это действительно немного странно, потому что во-первых, JS ищет каждую переменную, которую вы объявляете в своей функции (и сбросить/инициализировать их) и , затем выполните свою функцию.

Matt

+0

привет Мэтт, спасибо за объяснение! –

+0

Приветствую вас, товарищ! – math2001

0

Это происходит из-за концепции под названием грузоподъемных в JavaScript. Область переменной в функции t() поднимается до начала функции I. Она получает инициализацию с неопределенным, а позже «local» присваивается ей.

0

Это поведение называется variable hoisting.Следующий код:

function t() { 
    alert(scope); 
    var scope = "local"; 
    alert(scope); 
} 

На самом деле переводится:

function t() { 
    var scope; 
    alert(scope); // variable was declared in the current scope 
        // but not assigned a value yet 
    scope = "local"; 
    alert(scope); // should alert "local" 
} 
Смежные вопросы