2017-07-16 41 views
0

This code from Google Maps文档页面对我来说是一个谜。代码片段中的功能指的是一个对象google,一切都很好。Javascript对象只在函数内部可用,尽管没有被声明或传递给它们

我期望那个对象google存在于全局范围内,因为它被全局函数使用,否则它们无法知道它(即它们没有声明它,并且它没有被传入作为参数)

例如,如果我看到这样

function() { 
    // do some calc 
    anotherFunction(resultOfCalc) 
    ... 
} 

代码,我会认为anotherFunction可至少在父范围 - 如果不是全球性的。

Here is the JSFiddle for the Google code。请注意,我添加了一行console.log("Google obj:", google);

在控制台正在打印

VM573:66 Uncaught ReferenceError: google is not defined 
    at VM573:66 

但是,为什么?在代码的下一行是

function initMap() { 
    var map = new google.maps.Map(document.getElementById('map'), { 
    zoom: 10, 
    center: {lat: -33.9, lng: 151.2} 
    }); 

    setMarkers(map); 
} 

并没有有关使用google compaint。

请帮我理解这种奇特的行为。

<script async defer src="https://maps.googleapis.com/maps/api/js?key=…&callback=initMap"> 
</script>
+0

_Here是的jsfiddle ..._在哪里[** JSFiddle **](https://jsfiddle.net/)? –

+0

有没有一些异步的东西在那里?也许这个“谷歌”对象异步加载,并且在加载之前使用它? –

+0

@ibrahimmahrir在发布后加了一会 - 最初忘了。对不起 – CodyBugstein

回答

1

这个问题的脚本正在加载async defer

<script async defer src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk&callback=initMap"> 

2

库脚本使用调用回调的JSONP技术时google准备装在脚本加载之前您打电话给console.log

console.log("Google obj:", google);("Google obj:", google); 

一旦脚本加载,google将被设置为全局变量。因为查询字符串callback=initMap脚本src属性告诉谷歌打电话给你的功能时,这意味着它加载了google对象已经被设置为通过该点的全局变量

你的函数没有问题。

事实上,第一次运行你的小提琴时,你会得到错误。但在后续运行中,您不会收到错误,因为脚本被浏览器缓存,并有机会在调用console.log之前加载。

+0

感谢您的快速响应! – CodyBugstein

0

异步

设置这个布尔值,表明浏览器应该,如果 可能的,异步执行脚本。如果src属性不存在,则使用此属性 (即,对于内联脚本),在 这种情况下,它不起作用。

动态插入脚本默认异步执行,所以 接通同步执行(即脚本在它们 被加载的顺序执行)设置async=false

延迟

该布尔属性被设置为向浏览器表明脚本 意味着在解析文档之后执行,但在 之前触发DOMContentLoaded。如果src 属性不存在(即用于内联脚本),则不能使用此属性,在这种情况下, 不起作用。为了实现类似的动态插入 脚本的效果,请改为使用async=false

,你可以在脚本标签看你有没有deferasync它使这个脚本中,而页面解析与页面的其余部分异步执行,当执行console.log(google)和它的不确定就意味着这个脚本加载尚未完成。该文件被加载它调用myCustomFucntion功能后 的callback参数生成调用这个函数谷歌文件后loaded.for例如JS当你的脚本

<script async defer src="https://maps.googleapis.com/maps/api/js?key=…&callback=myCustomFunction"> 
</script> 

相关问题