有人可以解释我是如何搞砸了,为什么它有效以及如何纠正它

时间:2013-03-12 23:04:09

标签: javascript google-maps google-maps-api-3

我有一种奇怪的情况。就在最近,由于a previous question,我一直在尝试将一些代码从程序更改为基于对象。

我在代码中有几个地方调用函数中的函数(请原谅,我还在学习Javascript的术语),其中'this'具有不同的范围。

在尝试维持与父'this'的连接时,我试图通过将“thisObj = this”添加到函数调用中来将变量传递给函数,如下所示

geoLoc: function () {
    "use strict";
    var thisObj;
    if (navigator.geolocation !== undefined) {
        navigator.geolocation.getCurrentPosition(function (position) {
            thisObj.calcRoute('driving', position.coords.latitude + ', ' + position.coords.longitude, true);
        }, thisObj = this);
    }
},

所以,这适用于FF,所以我认为它一定没问题。使用jslint进行检查,所有内容都显示为绿色(或黄色/蓝色),没有任何错误。

然而,Chrome确定存在“错配dom例外17”,并决定不使用地理位置。

刚刚离开,我尝试移动该定义,因此它读作

geoLoc: function () {
    "use strict";
    var thisObj;
    if (navigator.geolocation !== undefined) {
        navigator.geolocation.getCurrentPosition(function (position) {
            thisObj.calcRoute('driving', position.coords.latitude + ', ' + position.coords.longitude, true);
        }), thisObj = this;
    }
},

令我惊讶的是,在FF和Chrome中工作过。不幸的是,它失败了jslint和IE只是踢了它的脚跟并且死了。

现在,我的问题是,我到底做了什么,首先让它与FF一起运行并传递jslint,如何在不诉诸实际命名第二个函数内的对象的情况下纠正这种情况,所以我可以直接传递给它。

请不要jquery。直接的javascript。并且比修复它的代码更重要,解释我实际上做了什么......如果可能的话请以外行人的话说,所以我可以进一步调查。

1 个答案:

答案 0 :(得分:1)

在Javascript中,您不需要四处传递变量,因为函数可以访问在“上面”函数中声明的变量。因此,您可以在名为this的变量(仅用于示例)中保存对当前对象that的引用,如下所示:

geoLoc: function () {
    "use strict";
    var that = this;
    if (navigator.geolocation !== undefined) {
        navigator.geolocation.getCurrentPosition(function (position) {
            that.calcRoute('driving', position.coords.latitude + ', ' + position.coords.longitude, true);
        }/* if you try to "add" something there, it comes as a 2nd argument for getCurrentPosition*/);
    }
},

你也可以说内部函数“包含”外部函数的范围,它非常特定于Javascript,并且在设计和使用它设计应用程序时非常有趣。有关更多信息,请在JS中查找“函数范围”和“闭包”。

编辑: navigator.geolocation.getCurrentPosition中的第二个参数应该是一个错误回调,即一个函数,你试图将, thisObj = this放在那里,这可能会导致某些浏览器失败或 - 执行 - 实际在调用成功回调(this的第一个参数)之前将thisObj分配给getCurrentPosition,因此在某些其他浏览器上“工作”。无论如何,这是不可靠的,应该避免。

我认为你需要从JS的基本语法特性开始,比如使用函数作为变量和其他函数的参数(这就是“回调”),这是一个主要的概念。而不是随意尝试移动部分代码(我的意见)。