0
点赞
收藏
分享

微信扫一扫

JS系列之-变量、作用域和内存

 变量

 传递参数

所有函数的参数都是按值传递的:把函数外部的值复制给函数内部的形参;基本类型很好理解就是复制一份给函数;引用类型也是复制一份值给函数,不过这个值是引用地址(指针)而已。需要注意的是:并不是参数按引用传递的,用下面代码说明:

function setName(obj){
	obj.name ='nike';
}
var person = new Object();
setName(person)
console.log(person.name) // 'nike'

// 真相了
function setName(obj){
	obj.name = 'nike'
  obj = new Object()
  obj.name = 'Marry'
}
var person = new Object()
setName(person)
alter(person.name) // 'nike'

代码解释:

如果函数参数传递是引用传递,则第二个方法中会改变 obj ,外部同样会改变,然而实际表明内部修改参数的引用并不会改变原始的引用。因此引用类型的函数参数传递一样是按值传递 


 执行环境及作用域

JS系列之-变量、作用域和内存_执行环境

执行环境(又称环境):定义了变量和函数有权访问的其他数据。每个执行环境都关联一个变量对象 ,环境中定义的变量和函数都保存在这个对象上。


全局执行环境是最外围的一个执行环境,宿主环境不同表示执行环境的对象也不一样,web浏览器中是window 对象。


每个函数都有自己的执行环境,当执行流进入一个函数时,函数会被推入环境栈中。函数执行完后,栈将其弹出,把控制权返回给之前的执行环境。


  当代码在一个环境中执行时,会创建变量对象的一个作用域链 。作用域的前端,始终是当前执行环境的变量对象。作用域链下一个变量对象 来自包含环境(即父函数)。。。一直到全局变量对象。 内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境中的任何变量和函数。

 注意点

变量的声明:使用 var 声明的变量会自动被添加到最接近的环境中,在函数内部:函数的局部环境。如果初始化变量没有使用var 声明,则该变量会被添加到全局环境中。

function add(sum1,sum2){
	sum = sum1 +sum2
  return sum
}
var result = add(1,2) // 3
alert(sum)	//3

举报

相关推荐

0 条评论