资讯专栏INFORMATION COLUMN

胡扯JS系列-内存模型和函数执行

douzifly / 1520人阅读

摘要:二在中函数是如何执行的函数我们之前已经都接触过了,函数无非有两部分数据和对数据的操作。函数的调用输出结果为我们使用了的调试,函数在执行时会将参数和函数中所用到的变量方法相同的地位,即在函数内部执行的时候不会区分是参数还是变量。

准备写点乱七八糟的文章,对JavaScript的胡扯

赋诗一首

对象本无根,

类型亦无形。

本来无一物,

何处惹尘埃?

一、JavaScript的内存模型

JavaScript的本质是一个对象,一个对象可以包含多个属性,对象的属性可以分为直接量和对象两种类型,而对象又分为Object对象和function对象两种类型。

按照数据类型划分:

简单数据类型

number

string

boolean

特殊数据类型

null

undefined

复杂数据类型

object

Object对象

function对象

直接量和对象的两种类型的属性在内存中保存方式不同(跟Java中的类似)

直接量:直接用两块内存分别保存属性名和属性值

对象:需要三块内存,分别保存属性名、属性地址和属性内容

对于对象类型的属性来说,属性名知识指向了保存对象的内存地址,而不是执行实际的对象,代码演示如下:

function F(){
    this.v = 1;
}
var f1 = new F();
var f2 = f1;
console.log(f2.v);
f2.v = 2;
console.log(f1.v);
f1 = null;
console.log(f2.v);

代码的执行图解:

我们一直都说JavaScript是脚本语言,在浏览器中解释执行的,不应该有自己的内存模型,其实不是这样的。无论编译语言还是解释型语言,他们的变量、函数、对象等数据都是保存在内存当中的,使用时需要通过变量名在指定地方找到对应的具体内容,然后再进行实际操作。

二、在JS中函数是如何执行的

函数我们之前已经都接触过了,函数无非有两部分:数据和对数据的操作。数据有分为外部数据内部数据。对于外部数据我们先不进行说明,这里主要是说函数,内部数据有分为参数变量两个部分。

参数(形参):在函数每次执行的时候参数都会被赋予一个新的数值;

变量(局部变量):每次都会设置为一个相同的初始值;

函数的变量和参数是如何保存的呢?

函数在每次执行之前都会新建一个参数数组和一个变量数组(当然也可以合并为一个数组,而通常会使用栈来实现),然后将调用时所传递的参数设置到参数数组中,而变量数组在每次执行都具有相同的内容。简单的数据会直接保存在数组当中,而复杂的数据,数组只是保存地址,具体的数据保存在堆中。

function paramTest(p1){
    var message = "Hello World";
    console.log(p1);
    for(var i in arguments){
        console.log(arguments[i]);
    }
}
//函数的调用
paramTest("a","b","c");
//输出结果为: a a b c

我们使用了Chrome的调试,函数在执行时会将参数p1和函数中所用到的变量messag、i方法相同的地位,即在函数内部执行的时候不会区分是参数还是变量。在JS的函数中,会自动创建一个名字为arguments的内部变量,然后将所有的参数的地址保存到其中。arguments 类似数组对象,可以通过它来获取函数调用时所传递的参数。

paramTest方法首先打印了p1的值,然后遍历打印arguments中所有的参数的值,可以看出参数p1的值和arguments[0]的值是一样的,函数的参数按照顺序依次保存在arguments变量中,在调用函数时传入参数的个数也可以和定义时不一样,所以说JS中不存在同名函数的重载方法。

在函数定义的变量时函数级作用域而不是块级作用域

function scopeTest(){
    if(true){
        var message = "Hello World";
    }
    console.log(message);
}
//函数的调用
scopeTest();
//输出结果为:Hello World

这里的message是在if语句块中定义的,但是在if语句外部依然可以进行调用。

在JS中的方法执行时会将其自身所有使用var定义的变量统一放到前面介绍的变量数组当中,所以在一个函数中,所有使用var定义的变量都是同等地位的

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/100779.html

相关文章

  • 胡扯JS系列-匿名函数的自动运行

    摘要:函数有很多种,我们就选择我们不懂的函数开始学习中自动运行的匿名函数在中可以使用匿名函数在我们学习的时候也有类似的概念,匿名实现类,在中的函数也是一种对象,也是需要一块内存对其进行保存。 showImg(https://segmentfault.com/img/remote/1460000017808564); 函数有很多种,我们就选择我们不懂的函数开始学习! JS中自动运行的匿名函数 ...

    马龙驹 评论0 收藏0
  • JavaScript学习

    摘要:和,前者是过滤选择器而后者是子代选择器。第三章中的操作查找节点想要查找元素节点或者是属性节点,就是通过前一章学习的选择器获取相应元素的文本,或者是通过选择器属性名获取某元素相应属性的值。 About Javscript record the thing which maybe forgetten 原生JavaScript Javascript DOM document.writ...

    J4ck_Chan 评论0 收藏0
  • Emscripten教程之Emscripten的运行时环境(二)

    摘要:运行时环境与大多数应用程序所期望的环境不同。不过程序是要手动交换缓冲区的。第一个主题介绍代码可移植性与限制第二个主题介绍的运行时环境第三个主题第一篇文章介绍连接和第三个主题第二篇文章介绍第四个主题介绍文件和文件系统第六个主题介绍如何调试代码 翻译:云荒杯倾本文是Emscripten-WebAssembly专栏系列文章之一,更多文章请查看专栏。也可以去作者的博客阅读文章。 Emscrip...

    VishKozus 评论0 收藏0
  • JavaScript 是如何工作的:JavaScript 的共享传递按值传递

    摘要:它对数组和对象使用按值传递,但这是在的共享传参或拷贝的引用中使用的按值传参。例如在这里,变量和值在执行期间存储在堆栈中。返回值这是可选的,函数可以返回值,也可以不返回值。变量被推入堆栈,从而在执行时成为的副本。 这是专门探索 JavaScript 及其所构建的组件的系列文章的第 22 篇。 想阅读更多优质文章请猛戳GitHub博客,一年百来篇优质文章等着你! 如果你错过了前面的章节,可...

    keithyau 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<