举例详解,tagName获得作用标签示例代码

复制代码 代码如下:

一、为什么JavaScript是单线程?

cookie很实用的一个功能,可以判断某个状态,在项目中使用率极高

<script type=”text/javascript”
src=”jquery1.4.js”></script>
<script type=”text/javascript”>
$(function(){
$(“.test li,.test dd”).click(function(){
alert(‘本身为大写:’ + $(this).get(0).tagName +
‘\n利用toLowerCase()转换为小写:’ +
$(this).get(0).tagName.toLowerCase() +
‘\n利用toUpperCase()转换为大写:’ +
$(this).get(0).tagName.toUpperCase());
})
});
</script>

JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊。

复制代码 代码如下:

<div class=”test”>
<ul>
<li>lili</li>
<li>lili</li>
</ul>

JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?
所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,将来也不会改变。

    function setCookie(name,value) 
    { 
        var Days = 30; 
        var exp = new Date(); 
        exp.setTime(exp.getTime() + Days*24*60*60*1000); 
        document.cookie = name + “=”+ escape (value) + “;expires=” +
exp.toGMTString(); 
        var strsec = getsec(time); 
        var exp = new Date(); 
        exp.setTime(exp.getTime() + strsec*1); 
        document.cookie = name + “=”+ escape (value) + “;expires=” +
exp.toGMTString(); 
    } 
    //读取cookies 
    function getCookie(name) 
    { 
        var arr,reg=new RegExp(“(^| )”+name+”=([^;]*)(;|$)”); 
        if(arr=document.cookie.match(reg)) 
            return (unescape(arr[2])); 
        else 
            return null; 
    } 
    //删除cookies 
    function delCookie(name) 
    { 
        var exp = new Date(); 
        exp.setTime(exp.getTime() – 1); 
        var cval=getCookie(name); 
        if(cval!=null) 
            document.cookie= name +
“=”+cval+”;expires=”+exp.toGMTString(); 
    } 

<dl>
<dd>dddd</dd>
<dd>dddd</dd>
</dl>
</div>

为了利用多核CPU的计算能力,HTML5提出Web
Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。所以,这个新标准并没有改变JavaScript单线程的本质。

您可能感兴趣的文章:

  • 用js读、写、删除Cookie代码分享及详细注释说明
  • JavaScript
    cookie的设置获取删除详解
  • JS保存和删除cookie操作
    判断cookie是否存在
  • js中cookie的添加、取值、删除示例代码
  • JS操作Cookies包括(读取添加与删除)
  • js删除所有的cookie的代码
  • javascript cookies
    设置、读取、删除实例代码
  • javascript操作cookie的文章(设置,删除cookies)
  • JavaScrpt中如何使用 cookie
    设置查看与删除功能

二、任务队列

单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。

如果排队是因为计算量大,CPU忙不过来,倒也算了,但是很多时候CPU是闲着的,因为IO设备(输入输出设备)很慢(比如Ajax操作从网络读取数据),不得不等着结果出来,再往下执行。

JavaScript语言的设计者意识到,这时CPU完全可以不管IO设备,挂起处于等待中的任务,先运行排在后面的任务。等到IO设备返回了结果,再回过头,把挂起的任务继续执行下去。

于是,JavaScript就有了两种执行方式:一种是CPU按顺序执行,前一个任务结束,再执行下一个任务,这叫做同步执行;另一种是CPU跳过等待时间长的任务,先处理后面的任务,这叫做异步执行。程序员自主选择,采用哪种执行方式。

具体来说,异步执行的运行机制如下。(同步执行也是如此,因为它可以被视为没有异步任务的异步执行。)

(1)所有任务都在主线程上执行,形成一个执行栈(execution context
stack)。
(2)主线程之外,还存在一个”任务队列”(task
queue)。系统把异步任务放到”任务队列”之中,然后继续执行后续的任务。
(3)一旦”执行栈”中的所有任务执行完毕,系统就会读取”任务队列”。如果这个时候,异步任务已经结束了等待状态,就会从”任务队列”进入执行栈,恢复执行。
(4)主线程不断重复上面的第三步。

下图就是主线程和任务队列的示意图。

图片 1

只要主线程空了,就会去读取”任务队列”,这就是JavaScript的运行机制。这个过程会不断重复。

三、事件和回调函数

“任务队列”实质上是一个事件的队列(也可以理解成消息的队列),IO设备完成一项任务,就在”任务队列”中添加一个事件,表示相关的异步任务可以进入”执行栈”了。主线程读取”任务队列”,就是读取里面有哪些事件。

“任务队列”中的事件,除了IO设备的事件以外,还包括一些用户产生的事件(比如鼠标点击、页面滚动等等)。只要指定过回调函数,这些事件发生时就会进入”任务队列”,等待主线程读取。

所谓”回调函数”(callback),就是那些会被主线程挂起来的代码。异步任务必须指定回调函数,当异步任务从”任务队列”回到执行栈,回调函数就会执行。

“任务队列”是一个先进先出的数据结构,排在前面的事件,优先返回主线程。主线程的读取过程基本上是自动的,只要执行栈一清空,”任务队列”上第一位的事件就自动返回主线程。但是,由于存在后文提到的”定时器”功能,主线程要检查一下执行时间,某些事件必须要在规定的时间返回主线程。

四、Event Loop

主线程从”任务队列”中读取事件,这个过程是循环不断的,所以整个的这种运行机制又称为Event
Loop(事件循环)。

为了更好地理解Event Loop,请看下图(转引自Philip Roberts的演讲《Help,
I’m stuck in an event-loop》)。

发表评论

电子邮件地址不会被公开。 必填项已用*标注