1、文字标注穿透
问题描述:开启了深度测试,导致文字标注随地球转动
解决:利用css显示和隐藏,得到地球中心点坐标,得到可视化区域,当移动地球时,目标已不在这个经纬度区域,故隐藏。
2、settimeout的闭包问题
在解决问题1时,需要先得到标注ThePrimitive1,但发现输出undefined,检查后发现是在定时器中执行得到ThePrimitive1的代码,产生了闭包。
在函数运行完之后,内部的函数是要被销毁的而且函数中有与外部同名的变量的时候,会优先采用自己内部的变量,达到避免命名冲突,而且外部函数访问不到内部函数的变量(作用域链)
//正常执行代码
var ThePrimitive1 = undefined;
setTimeout(function(){
//给ThePrimitive1 赋值
//ThePrimitive1 = ;
}, 3000);
console.log(ThePrimitive1) //undefined;
//解决闭包时的代码(错误)
//!!!!!!!!!!!出现问题,定时器上面的代码没有执行,直接执行定时器了(原因不明)
setTimeout((function(){
//给ThePrimitive1 赋值
//ThePrimitive1 = ;
})(), 3000);
console.log(ThePrimitive1) //这里输出也是undefined,因为ThePrimitive1定义时是基本数据类型,是值传递。
//而且按照时间循环机制来看,也是undefined
//如果要这个输出实体对象,将ThePrimitive1定义为对象,这样就是引用传递了;
//解决闭包时的代码(没有其他问题) 自执行函数
// var primitive = _this.ThePrimitive1; //_this.ThePrimitive1=undefined;
(function () {
_this.timer = setTimeout(function () {
//给primitive 赋值
primitive = ;
//移动地球时的操作
_this.moveEarth(Eq_data, primitive);
}, 3000);
})();
自执行函数
//定时器中解决闭包的两种实现方式:输出0 1 2 3 4 5
//方法1:自执行函数
for(var i=0;i<5;i++){
(function(num){
setTimeout(function(){
console.log('delayer:' + num );//操纵变量num,和i无关 创建了自己的作用域
}, 0);
})(i); // i是参数 对应着a
console.log(i);
}
//方法2:
for(var i=0;i<5;i++){
setTimeout((function(){
console.log('delayer:' + i );
})(), 0);
console.log(i);
}
区别在哪????
setTimeout((function(){
})(), 3000);
(function () {
setTimeout(function () {
}, 3000);
})();
3、传值,传引用
基本数据类型传值,对象传引用
https://www.jianshu.com/p/8af82d696ce1
通过实参调用函数的时候,传入函数里的是实参的副本而不是实参,因此在函数里面修改参数值并不会对实参造成影响。