0

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

我在代码中有几个地方调用函数中的函数(请原谅,我仍在学习 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。比修复它的代码更重要的是,解释一下我实际上做了什么……如果可能的话,请用外行的话,所以我可以进一步调查。

4

1 回答 1

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 中查找“函数范围”和“闭包”。

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

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

于 2013-03-12T23:10:02.190 回答