position.coords.latitude在window对象中的位置技术咨询
关于Geolocation中position.coords的位置疑问解答
首先来看你提供的获取位置的代码:
function getLocation() { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(showPosition); } else { alert("Geolocation is not supported by this browser."); } } function showPosition(position) { var lat = position.coords.latitude; var lon = position.coords.longitude; }
你的疑问是:对这段代码的运行逻辑有大致了解,但始终找不到position.coords.latitude在window对象中的来源。按逻辑它应该位于window.position.coords.latitude或window.navigator.geolocation下的某个位置,但通过console.log打印window时,在这两个位置都找不到它,想知道该属性在window对象中的具体位置。
哈哈,这其实是个很容易踩的小误区!position对象根本不在window全局对象里,它是浏览器在调用你传入的showPosition回调函数时,临时创建并作为参数传递给你的局部对象,函数执行完毕后就会被垃圾回收机制处理掉,不会挂载到全局环境中。
具体的运行流程是这样的:
- 当你调用
navigator.geolocation.getCurrentPosition(showPosition)时,浏览器会在后台发起获取用户位置的请求 - 一旦位置信息获取成功,浏览器会自动创建一个标准的
GeolocationPosition对象(也就是你代码里的position参数),里面包含了coords等位置相关数据 - 接着浏览器会调用你定义的
showPosition函数,把这个临时创建的GeolocationPosition对象作为参数传入函数内 - 这个
position对象只存在于showPosition函数的执行上下文里,函数执行完成后就会被销毁,所以你在全局的window对象里完全找不到它的踪迹
如果你想验证这个结论,可以在showPosition函数里做这两个操作:
function showPosition(position) { console.log(position); // 这里能直接打印出完整的位置对象 window.globalPosition = position; // 手动将它挂载到window全局对象 var lat = position.coords.latitude; var lon = position.coords.longitude; }
这样操作后,你再打印window就能找到globalPosition属性了,但这只是你手动挂载的结果,原生的position参数本身并不会出现在全局环境中。
内容的提问来源于stack exchange,提问作者Austin Karren
相关产品推荐
相关产品推荐

