javascript变量、作用域和内存问题
一.基本类型(传值后两者不互相影响)
5种:Undefined、Boolean、Null、Number、String
基本类型的赋值是传递该值得副本。两者可以参与任何操作而不受影响。
二.引用类型(传值后两者会互相影响)
指可由多个值构成的对象
变量为引用类型的变量,其存储的是指向存在内存(堆)中的引用类型的指针的值
传值为传指针的值的副本,最终两者指向的是内存中同一个位置,两者会互相影响。
三.传递参数
1.传递的参数为基本类型:
被传递的值会被复制给一个局部变量。(参数属于arguments对象中的一个元素)
2.传递的参数为引用类型:
会把这个值在内存中的地址复制给一个局部变量,因此局部变量的变化会反映在函数外部。
function addTen(num){ num += 10; return num; } var count = 10; var result = addTen(count);//传基本类型,为传副本,两者互不影响 console.log(count);//10 console.log(result);//20
四.检测类型
1.typeof操作符是确定一个变量是字符串、数值、布尔值、还是undefined的最佳工具(确定基本类型的种类)
2.instanceof是确定引用类型是Object、Array、RegExp的最佳工具
五.执行环境及作用域
javascript有两种作用域:全局作用域、函数作用域
内部环境可以通过作用域链访问所有的外部环境,但是外部环境不能访问内部环境中的任何变量和函数。每个环境可以向上搜索作用域链,以查询变量和函数名。
六.函数本身的作用域
函数本身也是一个值,有自己的作用域它的作用域就是其声明时所在的作用域,与其运行时所在的作用域无关。
var a = 1; var f = function(){ console.log(a); } function ff(){ var a = 10; f();//作用域是其声明时所在的作用域 } ff();//1
函数执行时所在的作用域,是定义时的作用域,而不是调用时所在的作用域
//var a = 1; var f = function(){ console.log(a);//a is not defined } function ff(){ var a = 10; f(); } ff();
总结:函数体外声明的函数,作用域绑定外层;
函数体 内声明的函数,作用域绑定内层;
链接:http://javascript.ruanyifeng.com/grammar/function.html
var p = 2; function f(p) { console.log(p);//2 因为基本类型传值为传副本 p = 3; console.log(p);//3 对p进行再赋值 var p = 1; console.log(p);//1 对p进行再赋值 } f(p); console.log(p);//2