我有一种奇怪的情况。就在最近,由于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。并且比修复它的代码更重要,解释我实际上做了什么......如果可能的话请以外行人的话说,所以我可以进一步调查。
答案 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的基本语法特性开始,比如使用函数作为变量和其他函数的参数(这就是“回调”),这是一个主要的概念。而不是随意尝试移动部分代码(我的意见)。