作用域
//作用域产生了函数,函数绑定了作用域
//运行期上下文:当函数执行的前一刻,会创建一个称为执行期上下文的内部对象。一个执行期上下文定义了一个函数执行时的环境,函数每次执行时对应的执行上下文都是独一无二的,
所以多次调用一个函数会导致创建多个执行期上下文,当函数执行完毕,它所产生的执行上下文被销毁。
//【【scope】】:每个javascript函数都是一个对象,对象中有些属性我们可以访问,但有些不可以,这些属性仅供javascript引擎存取,【【scope】】就是其中一个。
eg:function test(){
}
test.[[scope]]
//scope是test的属性,是一个隐式属性。系统会通过scope的内部原理定期去调用它,但不会让用户去用
//scope指的就是我们所说的作用域,其中存储了运行期上下文的集合。
//但凡是内部的函数,被保存到函数的外部,必生成闭包
//立即执行函数定义:此类函数没有声明,在一次执行过后立即释放。适合做初始化工作。
//立即执行函数表示方法:(function(){}())w3c建议使用第一种表示方法;
(function(){})();
//只有表达式才能被执行符号执行。
eg:function test () {
var a = 123
}()
然而, + function test() {
console.log("a")
}(),这个函数声明可以立即执行,因为再function前面有“+”,在趋势上要将它转换为数字。“+”“-”“!”在这里代表的是正,负,非。
// 最外面的阔号包括函数声明,可以把函数声明转化为表达式
eg:(function test() {
console.log("a")
}())
系统不能执行它,因为它是函数声明,而不是表达式(改成函数表达式的形式就可以执行)
//能被执行符号()执行的表达式,这个函数的名字就会被自动忽略
//对象里面有属性和方法,方法就是函数的另一种表现形式。
//只被执行一次的函数,称为初始化函数。一般用在只需要用到这个初始化函数的结果。
function sum(a,b,c,d) {
b=2
console.log(arguments[1,2,3])
// *实参列表出生的时候,有几个实参,arguments就有几个实参.本例所示,arguments=[1],arguments里只有一个1.当形参比实参多的时候,多余的形参都会被定义为undefined。不再具有映射的规则
}
sum(1)
//当实参比形参多时,会把多出来的实参放到函数内部属性里,即arguments.
//arguments--【1,2,3】,类似于数组,叫做实参列表
//arguments与形参有一条映射规则,arguments里的东西有变化,形参的赋值跟着变化。形参的赋值有变化,arguments里的东西也跟着变化
//return:本意是把一个值返回到函数的外部,还有一个功能是终止函数。
// test(1, 2)
function test(){
//
// }
// test.[[scope]]
//scope是test的属性,是一个隐式属性。系统会通过scope的内部原理定期去调用它,但不会让用户去用
// function a(){
//
// }
// var glob=100
// a()
//a 被定义时 a.[[scope]]--->0:GO{}
//a 执行的前一刻时,创建了执行期上下文的内部对象, a.[[scope]]--->0:AO{}
// 1 :GP{}
//当在a函数里面访问某某某变量时,实际访问的就是变量的scope(作用域),scope里有作用域链,作用域链有顶端,有底端,系统会从作用域链底端依次向下去找
//查找变量:从作用域链顶端依次向下查找

浙公网安备 33010602011771号