本节,将围绕以下几点来讲。

  知识点:多线程、作用域、闭包、this

  先顶后看

1.多线程

  在不支持H5的浏览器中。使用Concurrent.Thread.js.

  在支持H5中,使用WebWork.

  在H5以前,js是不支持多线程的。其中存在同步池和异步池的概念。当同步池处理完后,会调用异步池的事件,定时任务等。

以下很明显的区分js是否是多线程执行的

c#

js

    <script>
setInterval(function () {
alert('1');
}, 1000);
</script>

使用Concurrent.Thread.js(本质是用的js定时函数来模拟多线程)

    <script>
Concurrent.Thread.create(function () {
$(btn).click(func);
function func() {
alert('message');
}
var i = 0;
while (1) {
console.log(i);
}
})
</script>

  

使用WebWorker(也不能操作DOM元素)

    <button id="btn">Test</button>
<script>
var work = new Worker('task.js');
work.onmessage = function (event) { //回调函数
alert(event.data);
}
work.postMessage(); //调用work,可以传参数 $(btn).click(func);
function func() {
alert('message');
}
</script> task.js:
onmessage = func;                    //调用的方法
function func() {
var i = 0;
while (1) {
console.log(i++);
}
}

  

2.作用域

  js是函数级作用域,内部能访问外部变量。没有块级作用域(if else try catch)

    <script>
if (false) var j = 100; //1.函数级作用域 2.变量前置
alert(j); //弹出undefined
alert(i); //报错 未定义
</script>

  自执行函数在声明变量后执行。

    <script>
var j = 100;
+function func() { //这里的~,也可以替换成+,!,~等其他一元操作符
alert(j); //弹出undefined
var j; //变量前置
}(); //如果没有这个~的话,解析器会认为function是一个函数声明的开始,而后面()将会导致语法错误。在function前面加上~时,就变成了一个函数表达式,而函数表达式后面又添加了一个()就变成了一个立即执行的函数了。
</script>

 

 

3.闭包

  闭包就是改变变量的作用域。闭包会产生内存无法释放问题。

        function func() {
var j = 10; //函数外不能访问到j
return function () { //通过闭包方式让外面能访问到j
return j;
}
}
var k = func()();
alert(k);

 

 

4.this

  谁调用,this就指谁。当有闭包存在的时候,需注意this指向的调用者。

    <script>
this.m = 10;
var obj = {
m: 1
, func: function () {
alert(this.m);
}
, bb: function () { //闭包函数
return function () {
alert(this.m);
}
}
}
obj.func(); //this指obj
obj.bb()(); //最终this指window
</script>

  

  附件:Concurrent.Thread.js

  本节也只是抛砖引玉,内容中可能有误,希望各位如果发现错误的话,请及时告知。

最新文章

  1. Thinkphp去掉index.php
  2. Lua协程
  3. Volley源码分析(2)----ImageLoader
  4. ruby学习总结04
  5. Qt 串口学习2
  6. 回顾JDBC
  7. BZOJ3451: Tyvj1953 Normal
  8. 在eclipse中运行storm-starter
  9. 如何对 Android 库进行依赖管理?
  10. hdu 1317 XYZZY
  11. 已知直线上的两点 A(x1, y1), B(x2, y2) 和另外一点 C(x0, y0),求C点到直线的距离。
  12. iOS视频编辑SDK
  13. F# 语法概览
  14. 文件I/O实践(3) --文件共享与fcntl
  15. Python中实用却不常见的小技巧
  16. retry重试常见场景及实现
  17. 标注的SQL拼接语句
  18. MongoDB数据库中更新与删除数据
  19. mybatis结合mysql批量操作及查询sql
  20. Python单元测试框架之pytest 3 -- fixtures

热门文章

  1. OSG消息机制之消息分析
  2. r.js结合gulp等于webpack(angular为例)
  3. Go语言的编程范式
  4. 我就是认真:Linux SWAP 深度解读(必须收藏)
  5. 在线QQ客服 生成
  6. 关于使用cocoaPods,import导入时第三方库头文件没有提示问题的解决办法
  7. noip 2015 提高组
  8. SpringMVC项目学习1_web.xml
  9. asm.uew
  10. 从Linux终端管理进程:10个你必须知道的命令
  11. PHP+Redis 实例【二】页面缓存 新玩法
  12. Android 获取手机信息
  13. ROS探索总结(十七)——构建完整的机器人应用系统
  14. CUDA执行模型
  15. linux --- Ansible篇
  16. DataTable序列化
  17. HttpRunnerManager使用(一)
  18. 在 浏览器中调用外接设备— —手写板 【win10 x64 手动注册ocx控件的方法】
  19. Let Encrypt延期(转自虞大胆的叽叽喳喳)
  20. C# http监听之Nancy.net