javascript的解析以及内存原理
2016-12-31 11:31
225 查看
1.JavaScript有“预解析”行为。理解这一特性是很重要的,不然在实际开发中你可能会遇到很多无从解析的问题,甚至导致程序bug的存在。
js的运行过程中并不是按照代码的编写顺序自上而下进行解析的,代码如下:
function showMsg()
{
alert('This is message');
}
showMsg(); // This is message
相反我们同样知道如下代码也是可以进行函数调用的,也可以正常的运行,所以我们说js中是有"预解析"的。
showMsg(); // This is message
function showMsg()
{
alert('This is message');
}
看下面一组代码:
var x = 1;
console.log(x);
console.log(y);
var y = 2;
var z ;
console.log(z);
z=3;
那么,看官您的答案和标准的答案是否一样呢,标准答案如下
为什么是这样一个答案呢,输出y的时候明明没有对y进行定义啊,
这就是js预解析的神奇所在,它会把所有的var声明的变量进行一个前置,叫做变量的声明提升,说白了就是把var y 提到了输出以前,
在输出y的时候其实已经有了y这个变量了,只是没有赋值而已。
2.js的内存原理
var a = {name: 1};
var b = a;
console.log(a);
console.log(b);
b.name = 2;
console.log(a);
console.log(b);
var b = {name: 3};
console.log(a);
console.log(b);
var x = 1;
console.log(x);
console.log(y);
第一组输出时是怎样的呢,我们以图为例:
a的值为{name:1},a赋值给了b,a和b同时指向同一内存,内存中的数据就是{name:1},那么很简单b的值也是{name:1},
这时代码b.name = 2,它都进行了那些操作呢
把这一内存中的数据name的值 变为了2,那么因为a和b指向的是同一内存,改变也就相当于作用在了a和b上,
所以第二组输出就都是{name:2}。
我们继续看代码,之后执行了var b,这句代码相当于重新定义了b,也就改变了b指向的内存,我们看图
var b = {name:3},就相当于给b重新定义了一块内存,这块内存中的数据为{name:3},但是这时a的指向并没有发生改变,
所以最后一组输出为a {name:2} b {name: 3}。
好了,看过了的你是不是也懂了呢,
js的运行过程中并不是按照代码的编写顺序自上而下进行解析的,代码如下:
function showMsg()
{
alert('This is message');
}
showMsg(); // This is message
相反我们同样知道如下代码也是可以进行函数调用的,也可以正常的运行,所以我们说js中是有"预解析"的。
showMsg(); // This is message
function showMsg()
{
alert('This is message');
}
看下面一组代码:
var x = 1;
console.log(x);
console.log(y);
var y = 2;
var z ;
console.log(z);
z=3;
那么,看官您的答案和标准的答案是否一样呢,标准答案如下
为什么是这样一个答案呢,输出y的时候明明没有对y进行定义啊,
这就是js预解析的神奇所在,它会把所有的var声明的变量进行一个前置,叫做变量的声明提升,说白了就是把var y 提到了输出以前,
在输出y的时候其实已经有了y这个变量了,只是没有赋值而已。
2.js的内存原理
var a = {name: 1};
var b = a;
console.log(a);
console.log(b);
b.name = 2;
console.log(a);
console.log(b);
var b = {name: 3};
console.log(a);
console.log(b);
var x = 1;
console.log(x);
console.log(y);
第一组输出时是怎样的呢,我们以图为例:
a的值为{name:1},a赋值给了b,a和b同时指向同一内存,内存中的数据就是{name:1},那么很简单b的值也是{name:1},
这时代码b.name = 2,它都进行了那些操作呢
把这一内存中的数据name的值 变为了2,那么因为a和b指向的是同一内存,改变也就相当于作用在了a和b上,
所以第二组输出就都是{name:2}。
我们继续看代码,之后执行了var b,这句代码相当于重新定义了b,也就改变了b指向的内存,我们看图
var b = {name:3},就相当于给b重新定义了一块内存,这块内存中的数据为{name:3},但是这时a的指向并没有发生改变,
所以最后一组输出为a {name:2} b {name: 3}。
好了,看过了的你是不是也懂了呢,
相关文章推荐
- [ Javascript ] 内存泄露以及循环引用解析
- [ Javascript ] 内存泄露以及循环引用解析
- JVM内存模型以及垃圾收集策略解析
- struts2 文件上传 和部分源码解析,以及一般上传原理
- 举例详细说明javascript作用域、闭包原理以及性能问题
- JVM内存模型以及垃圾收集策略解析
- Javascript作用域、闭包原理以及性能问题
- 在atlas里面的UpdatePanel控件中调用javascript,以及updatePanel的一些原理
- 【状态保持】会话状态Session解析以及原理分析
- 举例详细说明javascript作用域、闭包原理以及性能问题
- cookies 原理以及解析
- 【状态保持】Cookice解析以及原理分析【续】
- 理解Javascript_01_理解内存分配原理分析
- 矩形相交以及求出相交的区域的原理解析
- JVM内存模型以及垃圾收集策略解析
- 由浅入深-javascript动画原理解析(一)
- JVM内存模型以及垃圾收集策略解析【续】
- 解析xml的几种方法,他们的原理,比较 以及JAVA源码
- COOKIES原理以及解析
- 深入解析javascript与asp.net对Cookie操作的异同,以及如何共用(一)。