@1002522146
2017-12-08T05:09:52.000000Z
字数 877
阅读 434
JavaScript
var a = 1;
function fn(){
console.log(a);// 1
a = 10;
console.log(a);//10
}
fn()
console.log(a);//10
var obj = {name = "Atom"}
function fn1(){
console.log(obj.name)//Atom
obj = {name = "Tom"}
console.log(obj.name)//Tom
}
fn1();
console.log("全局输出:"+obj.name);//Tom
JS中实参的传递是值传递,实际上是将变量的值作为实参传递.
当将一个保存对象的变量作为实参时,它实际上传递的是变量中保存的对象的引用
解析器在执行JS代码时都需要首先创建执行环境
在JS中执行环境分成 全局执行环境 和 函数执行环境。
要想执行JS代码,必须先创建执行环 一个页面中可能同时有多个执行环境.
这些执行环境在,环境栈中保存
- 栈(数据结构,类似于数组),LIFO(后进先出)
环境的创建流程:
- 执行环境在页面加载会调用函数时创建
1. 创建一个执行环境,并将其压入到环境栈的栈顶。
2. 创建一个变量对象, 并将其放入到作用域栈的栈顶。
3. 变量对象就是用来保存变量的对象函数。
4. 在执行过程中的局部变量和函数都在该对象中保存注意变量对象无法访问,除了全局变量对象(window)。
3. 对代码进行预解析,找var 和 function,
将使用var声明的变量 和使用 函数声明 创建的函数添加到变量对象中。
函数声明是在预解析阶段执行的,在逐行执行代码时,声明不会执行
4. 逐行执行函数中的代码。
5. 代码执行完毕,将执行环境从环境栈中弹出销毁,将变量对象从作用域栈中弹出销毁
alert(a); //function 4
var a = 1;
alert(a); // 1
function a(){alert(2)};
alert(a); //1
var a = 3;
alert(a); //3
function a(){alert(4)};
alert(a); //3