运行期上下文
当函数执行时,会创建一个称为“执行期上下文”的内部对象。一个执行期上下文定义了一个函数执行时的环境,函数每次执行时对应的执行上下文都是独一无二的,所以多次调用一个函数会创建多个执行上下文,当函数执行完毕,函数的执行上下文会被销毁。
作用域
[[scope]]:每个javascript函数都是一个对象,对象中有些属性我们可以访问,但有些不可以,这些属性仅供javascript引擎存取,[[scope]]就是其中一个;
[[scope]]指的就是我们所说的作用域,其中存取了执行期上下文的集合。
作用域链
[[scope]]所存储的执行期上下文对象的集合,这个集合成链式链接,也就是所谓的作用域链。
立即执行函数:
**定义:**此类函数没有声明,在一次执行过后即释放销毁。适合做初始化工作。
凡是只执行一次的函数都叫做针对初始化功能的函数,函数名可有可无。
//函数形式有两种,但建议第一种,执行完一次就会被销毁
(function(){
}());
(function(){
})()
//立即执行函数可以有参数
(function aa(a,b){
cosole.log(a + b);
}(1,2)) //输出3,但是再次访问aa(),会报错undefinde.
//也可以有返回值
var num = (function aa(a,b){
var c = a + b;
return c;
}(1,2)); //返回的值会变量num里面,num == 3
2、只有表达式才能被执行符号执行,例:
function test(){
console.log("123");
}(); //此种写法会报语法错误,因为()前的语句是叫函数声明,不是叫表达式
test(); //输出123,在这里会正常执行,单独的函数引用后面加括号表示执行
var test = function(){
console.log("123");
}() //输出123,因为括号前的语句是函数表达式,所以会执行。
3、有一个例外就是:
function test(a, b, c){
console.log(a + b + c);
}(1, 2, 3) //在后面括号里面写参数,是可以执行的,不会报语法错误,但是没有返回值,只是单纯的执行而已
4、能被执行符号所执行的表达式,会自动放弃函数的引用,也就是相当于成了立即执行函数,执行完后再访问函数引用,会显示undefined