其次,js还要跨平台!只要是能浏览网页的系统或设备,几乎都能运行js,这样js就要面对各种不同需求的挑战,众口难调,再好的厨师也不可能什么菜都能做得完美,乱是必须的。
最后,一种语言如果给人乱的感觉,那是因为用的人多,用途广泛,是不可或缺的表现!
第一:关于写法,上面四种写法都是没有错的,但是上面的写法应分为两类:第一类:this.width,this.attr("width")
第二类:$(this).attr("width"),$(this).width()
区别在于第二类写法使用了jQuery框架,否则这么写是会报错的。当然,你自己也可以创造一个这么样的写法。其运行的结果都是一样的,就是返回对象的宽度。
this 是 JavaScript 中的关键字。当this指向html元素对象的时候,只能调用html属性,没有attr()方法,这个时候就会报错,但却不能说this.attr("width")这种写法有什么错。因为可以给this指向的对象新建attr()方法。
$(this) 可以认为是用 jQuery 包装过 JavaScript 中的 this,包装后 $(this) 就会继承 jQuery 的方法。
比如:
$('a').click(function(){
this.innerHTM==$(this).html()=='jQuery'//三者是一样的.
this.getAttribute('href')==this.href==$(this).attr('href')//三者是一样的
this.getAttribute('target')==this.target==$(this).attr('target')//三者是一样的
this.getAttribute('data-id')==$(this).attr('data-id')//二者是一样的
})
总之,当结果符合你的要求,选择最简单的写法。
第二:关于结构, js在多数“正经”程序员眼中显得幼稚,是因为其本身有着先天的缺陷,所以你现在的混乱很大程度上是由当初的设计者造成的。
js是函数式编程与面向对象编程的混合产物。从结构上来说这两种编程风格的混合是让js写出来的东西很混乱原因。而这个问题造成你“应该用在什么结构上”感到无所适从的原因。
最后照着别人写不是问题所在,前提是要区分出哪些代码好,以及这么写的原因,总之保持你的好奇心与创造力,这才是编程的主要原因。最后,你的问题给我上了一课。
古老的做法是用settimeout或者setinterval实现循环动画,但是这样就会造成题主说的,在且页面的时候会造成混乱。
因为当页面失去焦点时浏览器不再渲染页面,但是settimeout/setinterval的请求不会停止,队列会一直堆积动画,当页面再次获得焦点时动画队列早已堆积了大量命令,就会导致动画混乱。
现在的做法,笼统地说,是使用requestanimationframe函数,用法和settimeout/setinterval类似,只不过requestanimationframe不接受时间参数,函数的执行频率由浏览器的渲染帧数决定,这就实现了由浏览器决定动画队列,避免了动画混乱。当然也可以使用一些现成的轮播图插件,题主可以自己百度,这里对比举例说明一下settimeout和requestanimationframe的用法。
//用setTimeout实现在控制台循环输出hello worldfunction fun(){
console.log('hello world')
setTimeout(function(){
fun()
},3000)
}
fun()//执行fun函数,就可以每隔3000毫秒递归的输出hello world
//用reqestanimationframe实现在控制台循环输出hello world
function fun(){
console.log('hello world')
requestAnimationFrame(function(){
fun()
})
}
fun()//执行fun函数,就可以每隔3000毫秒递归的输出hello world
//requestAnimationFrame没有时间参数,所以直接使用不能控制间隔
//但我们可以人为的限制执行间隔,方法如下
function fun(last_time){
if(new Date().getTime() - last_time > 3000){
console.log('hello world')
requestAnimationFrame(function(){
fun(new Date().getTime())
})
}else{
requestAnimationFrame(function(){
fun(last_time)
})
}
}
fun(new Date().getTime())
//这样就可以为requestAnimationFrame设置间隔,实现每隔3000毫秒输出hello world
//抱歉我主写c副写python偶尔写javaweb,分号用的有些乱。