JavaScript变量、作用域的问题讲解
一、变量的复制
1、保存基本类型值的变量:
复制此变量,就是将保存的值复制给新变量。原来的变量和复制的新变量,以后对其进行操作互不影响。
2、保存引用类型值的变量:
复制此变量,就是将保存的能找到引用类型值的路径复制给新变量。原来的变量和复制的新变量,以后对其进行操作相互影响。
二、内存分为堆和栈两个部分。其中基本类型的值保存在栈中,引用类型的值保存在堆中。
变量是储存在内存中的栈中。
1、保存基本类型值的变量:
变量是储存在内存中的栈中并且基本类型的值也是储存在栈中,复制该变量,在栈上会开辟新的内存空间,存放复制的变量,并且这两个变量以后的操作互不影响。因为此变量保存的就是实际的基本类型的值。
2、保存引用类型值的变量:
引用类型的值是储存在内存中的堆中,同时此变量保存的并不是实际的引用类型的值,而是保存着能找到引用类型值的路径,在栈中复制变量,只是相当于把路径复制了,也就是两个变量都能通过相同路径找到同一引用类型,操作其中一个变量去改变引用类型的属性,也会影响另一个变量的相同属性。也就是说这两个变量的操作是相互影响的。
三、函数的参数是一个变量
在 ecmascript中,所有函数的参数都是按值或按路径传递的。将函数外部变量放到函数里作为参数,实际上是将外部变量保存的值或者路径复制一份给函数的参数变量。
四、检测类型
typeof 是用来检测基本数据类型的。
instanceof 是用来检测引用数据类型的。
五、全局变量和局部变量
全局变量:定义在函数外部的变量,或者函数内部未用var声明的变量。任何地方都可以访问全局变量。
局部变量:定义在函数内部并用var声明的变量。只有在函数内部才可以访问此变量。
(作用域:变量起作用的区域。分为:全局作用域和局部作用域)
六、作用链
例:在函数内部访问变量a,会先在最近的作用域下寻找是否有用变量a,如果没找到,则会去上一级作用域下寻找用变量a,就这样一级一级的往上寻找,直到找到为止。
(注意:只找用var声明的变量a,无论变量a是否赋值或者没用var声明但已经赋值的变量a)
七、没有块级作用域
由“{}”括号封闭的代码称为代码块。js中,代码块中定义的变量可以在代码块内、外进行访问。在其他语言中,则只能在代码块内部进行访问。
上一篇: 搜狗输入法一骑绝尘 市场份额超七成