2015-06-28 3 views
18
var test = function() { 

    'use strict'; 

    var mapNames = { 
     'name': 'City Name:', 
     'coord.lat': 'Latitute:' 
    }; 

    for (var key in mapNames) { 

     var names; 

     if (mapNames[key]) { 
      name = mapNames[key]; 
     } else { 
      name = key; 
     } 
    } 

    console.log(name); 

} 

test(); 

В приведенном выше коде я сделал ошибку, объявив переменную names и используя вместо этого name. Я думал, что «строгий» режим поймает его, но это не так. Разве это не должно вызывать ошибку в этом случае?JavaScript «строгий режим» работает не так, как ожидалось?

ответ

25

A name глобальная переменная уже существует, не имеет отношения к вашему коду; он представляет имя текущего окна, поэтому вы назначаете уже существующую переменную.

window.name; // the name of the current window for cross-window communication 

Все на window объявлена ​​как глобальная - так что это не ссылаться-erroring, поскольку она является назначение переменной во внешней области видимости.

Супер запутанным: D


"use strict" будет препятствовать определению новых глобальных переменных, здесь мы выполняем задание существующей переменной, думать о нем, как name находится в глобальном масштабе, как window.Blob, window.console и так далее.

+0

не должен '' использовать строгий "' предотвращать именно это? –

+3

@JanDvorak '' use strict "' будет препятствовать определению новых глобальных переменных, здесь мы выполняем присвоение _an существующей переменной_, думаем об этом как 'name' в глобальной области видимости, например' window.Blob', 'window. консоль и т. д. –

+0

ах, браузер уже предоставляет переменную с этим именем. Можем ли мы иметь супер-строгий режим, при котором невозможно получить доступ к глобальным именам по имени? :-) –