一、执行上下文
- 单线程
- 同步执行,只有栈顶的上下文处于执行中,其他上下文需要等待
- 全局上下文只有唯一的一个,它在浏览器关闭时出栈
- 函数的执行上下文的个数没有限制
- 每次某个函数被调用,就会有个新的执行上下文为其创建,即使是调用的自身函数,也是如此。
例:
var color = 'blue';
function changeColor() {
var anotherColor = 'red';
function swapColors() {
var tempColor = anotherColor;
anotherColor = color;
color = tempColor;
}
swapColors();
}
changeColor();
二、作用域
1、变量作用域
- 全局变量:在全局声明的变量,任何地方都可以访问
- 局部变量:在函数里声明的变量,只有函数里内访问
——几个注意点:
1)声明局部变量必须用var,不然会污染全局变量
scope = "gobale";
function checkscope() {
scope = "local";
}
checkscope();
console.log(scope); //"local"
2)一般来说内部能访问外部,外部不能访问内部。
那么怎么让外部也能访问内部? —— return
2、函数作用域
js没有块级作用域,而有函数作用域。
函数作用域是指:在函数内声明的所有变量在函数体内是始终可见的。
三、闭包
什么是闭包
参考:学习Javascript闭包(Closure)——阮一峰
- 有权访问另一个函数作用域中的变量的函数
- 定义在一个函数内部的函数
function f1(){
var n=999;
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
f2()就是闭包
闭包的作用
四、this
- 全局函数里,this 等于window
- 函数被作为某个对象的方法调用时,this等于那个对象
- 匿名函数执行环境具有全局性,this指向window
(可以通过call()或apply()改变函数执行环境)