js运行机制 值引用 值传递
1.js是单线程的 为什么是单线程的呢 因为js作为浏览器脚本语言,会有很多和用户的互动,以及操作dom,多个线程会出问题。
2.js有同步任务,异步任务(ajax,用户点击等,settimeout)
异步任务执行机制:
a.同步任务都在主线程上执行,形成执行栈;
b.主线程外,存在一个任务队列,(虽然js是单线程的,但是浏览器内核是多线程的,在浏览器内部中不同异步操作由不同内核模块调度执行,异步操作回将相关操作添加到任务队列上,不同异步操作添加到任务队列的时机也是不同的 onclick--DOM Binding模块处理,事件触发时,回调函数会立即添加到任务队列中;settimeout -- timer模块---时间到达加入任务队列;ajax---network模块----请求完成返回后添加到任务队列)
c.一旦执行栈中所有同步任务处理完成,系统会自动读取任务队列,进入执行栈,开始执行,实现事件循环(Event Loop)
例如
for(var i=0;i<3;i++){
setTimeout(function(){
console.log(i)
},0)
}
答案是3 3 3
解析:setTimeout异步执行,要等到主线程执行完,for操作是主线程任务,i=3;再起执行settimeout 此时已经是3
改造之后变输出为0,1,2
for(var i=0;i<3;i++){
(function(i){
setTimeout(function(){
console.log(i)
},0)
})(i)
}
var obj={i:0}
for(;obj.i<3;obj.i++){
(function(obj){
setTimeout(function(){
console.log(obj.i)
},0)
})(obj)
}
var obj={i:0}
for(;obj.i<3;obj.i++){
(function(obj.i){
setTimeout(function(){
console.log(obj.i)
},0)
})(obj.i)
}
答案分别是0,1,2 和 3 3 3合0,1,2
说第二个问题之前 了解知识点
js基本类型number string boolean undefined null 基本类型“按值”访问 存放在栈区 得到实际的值
引用类型 对象 数组 函数(拥有属性和方法)并且都能修改 引用类型对象存放方式是“名字+堆地址”,赋值的过程是名字和堆地址,堆内存中的数据没有变化,所以两个对象有可以联动。
所以上面的问题 其实也是在考察这一块
var a = 1;
var obj = {
b: 2
};
var fn = function () {};
fn.c = 3; function test(x, y, z) {
x = 4;
y.b = 5;
z.c = 6;
return z;
}
test(a, obj, fn);
alert(a + obj.b + fn.c);
答案是:。。。
补充知识推荐Job Quene https://zhuanlan.zhihu.com/p/22710155
最新文章
- JQuery,拼接字符串问题(求助)
- jquery.tmpl.js 模板引擎用法
- struts.xml配置详解
- [Stanford 2011] MVC introduction
- TKinter之菜单
- http://www.cnblogs.com/leiOOlei/p/5075402.html
- Oracle 经典语法(二)
- 二分图匹配之KM求二分图最佳匹配算法
- 函数之DisString
- java读取文件方法总结
- 使用ReflectionToStringBuilder实现toString方法
- Zabbix 3.0 基础介绍 [一]
- Netty 4源码解析:服务端启动
- iphone 屏蔽系统自动更新,消除设置上的小红点
- centos7安装zabbix3.0超详细步骤解析
- vue--vConsole
- Opentsdb分布式安装
- 如何安装pycharm
- cocos2d-x(十一)Lua开发飞机大战-6-加入子弹
- poj 2391 (Floyd+最大流+二分)
热门文章
- .static 和const分别怎么用,类里面static和const可以同时修饰成员函数吗。
- 关于Junit中Assert已经过时
- twemproxy《一》
- C# - 音乐小闹钟_BetaV3.0
- php检测数组长度的函数sizeof count
- 修改anaconda3 jupyter notebook 默认路径
- python 实用技巧:几十行代码将照片转换成素描图、随后打包成可执行文件(源码分享)
- Spring之BeanFactory:解析getBean()方法
- 学习笔记之IdentityServer4(一)
- Redis中关于key的操作指令