OpenLayers:为什么浏览器中的 console.log 可以找到变量

OpenLayers: Why the console.log in browser can find the variable

我试图从浏览器 console.log(ol_map),但它给我一个 未定义 错误。该命令在 code.Why 期间有效吗?

我使用 Symfony 框架,使用 Webpack Encore 来管理我的资产。

This is a screenshot from the browser

文件:map.js

require('ol/ol.css');
require('../css/map.css');

import View from 'ol/view';
import VectorLayer from 'ol/layer/vector';
import TileLayer from 'ol/layer/tile';
import Map from 'ol/map';

var proj = require('ol/proj').default;
var ol_Map = require('ol/map').default;
//var ol_layer_Tile = require('ol/layer/tile').default;
var ol_source_OSM = require('ol/source/osm').default;
var ol_View = require('ol/view').default;
var coordinate = require('ol/coordinate').default;
//var VectorLayer = require('ol/layer/vector').default;
var VectorSource = require('ol/source/vector').default;
var GML = require('ol/format/gml').default;
var WFS = require('ol/format/wfs').default;

const ol_map = new Map({
    target: 'map',
    layers: [
        new TileLayer({
            source: new ol_source_OSM()
        }),
        //new VectorLayer({
        //    source: new VectorSource({
        //        format: new WFS(),
        //        url: 'http://environment.data.gov.uk/ds/wfs?SERVICE=WFS&INTERFACE=ENVIRONMENTWFS--864c72de-d465-11e4-855f-f0def148f590'
        //    })
        //})
    ],
    view: new ol_View({
        //cordinates in ESPG3857
        center: [-254382.41,7068896.29],
        zoom: 6
    })
});

console.log(ol_map);

文件:map.html.twig

{% extends '::base.html.twig' %}
{# STYLESHEETS-------------------------------------------------- #}
{% block stylesheets %}
    {{ parent() }}
    <link href="{{ asset('build/map.css') }}" rel="stylesheet" />
    {#<link href="https://openlayers.org/en/v4.6.5/css/ol.css" rel="stylesheet" type="text/css"/>#}
{% endblock %}
{# PAGE CONTENT-------------------------------------------------- #}
{% block title %}OpenLayers example{% endblock %}
{% block body %}
<body>
    <h2>My Map</h2>
    <div id="map" class="map"></div>
    <div class="arrow_box" id="popup-container" style="display: none;"></div>

    <script src="{{ asset('build/map.js') }}"></script>
</body>
{% endblock %}
{# JAVASCRIPTS-------------------------------------------------- #}
{% block javascript %}
    {{ parent() }}
    {#<script src="https://openlayers.org/en/v4.6.5/build/ol.js" type="text/javascript"></script>#}
{% endblock %}

这是我上面评论的详细解释:

在 Webpack 中,每个 module (file) imports and exports code. When the code is transpiled/packaged for the browser, each of those modules is enclosed into an closure,确保内部代码不会泄漏到其他模块中。这非常重要,否则您必须始终确保不会意外覆盖其他模块中的变量或函数。

我猜你错误地认为你的顶级模块是不同的,并且东西被导出到浏览器的顶级 (window) 范围。事实并非如此!

浏览器的控制台在主范围内工作,其中您的内部变量 ol_map 未知。当然,该变量在某处,但它在某个函数 内部 的某个地方(甚至更深,在子子...函数中)。也许你的变量也被 webpack 重命名了(为了使代码占用空间更小),所以即使你在代码中添加调试断点,你可能不会立即识别你的变量(但它就在那里!)。

但是,有一些全局的东西,您可以从模块内部访问它们:window 是浏览器 window 对象。它代表全局范围。例如,当您在控制台中写入 var x = 'hello'; 时,该变量 x 将成为 window 的 属性。

因此,通过在代码中编写 window.ol_map = ol_map,您创建了一个全局变量,然后您可以在浏览器和浏览器控制台中轻松访问它。