准备写点乱七八糟的文章,对JavaScript的胡扯赋诗一首:javascript
对象本无根,java
类型亦无形。数组
原本无一物,浏览器
何处惹尘埃?函数
JavaScript的本质是一个对象,一个对象能够包含多个属性,对象的属性能够分为直接量和对象两种类型,而对象又分为Object对象和function对象两种类型。this
按照数据类型划分:spa
简单数据类型调试
特殊数据类型code
复杂数据类型对象
object
直接量和对象的两种类型的属性在内存中保存方式不一样(跟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是脚本语言,在浏览器中解释执行的,不该该有本身的内存模型,其实不是这样的。不管编译语言仍是解释型语言,他们的变量、函数、对象等数据都是保存在内存当中的,使用时须要经过变量名在指定地方找到对应的具体内容,而后再进行实际操做。
函数咱们以前已经都接触过了,函数无非有两部分:数据和对数据的操做。数据有分为外部数据和内部数据。对于外部数据咱们先不进行说明,这里主要是说函数,内部数据有分为参数和变量两个部分。
参数(形参):在函数每次执行的时候参数都会被赋予一个新的数值;
变量(局部变量):每次都会设置为一个相同的初始值;
函数的变量和参数是如何保存的呢?
函数在每次执行以前都会新建一个参数数组和一个变量数组(固然也能够合并为一个数组,而一般会使用栈来实现),而后将调用时所传递的参数设置到参数数组中,而变量数组在每次执行都具备相同的内容。简单的数据会直接保存在数组当中,而复杂的数据,数组只是保存地址,具体的数据保存在堆中。
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定义的变量都是同等地位的