为什么说 JS 是一门很混乱的语言

JavaScript02169

为什么说 JS 是一门很混乱的语言,第1张

首先,js要面对多种解析器,每种浏览器都是一种不同的解析器,虽然有标准,但有些浏览器就是不按标准来(比如IE)。此种情况下,js不乱才怪!就好像中文,虽然是统一的语言,但每一省每一市每一县甚至每一乡的语音都不一样,乱吗?乱!

其次,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 world

function 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,分号用的有些乱。