[[scope]]:每个 javascript 函数都是一个对象,对象中有些属性我们可以访问,但有些
不可以,这些属性仅供 javascript 引擎存取,[[scope]]就是其中一个。[[scope]]指的就
是我们所说的作用域,其中存储了运行期上下文的集合。
作用域链:[[scope]]中所存储的执行期上下文对象的集合,这个集合呈链式链接,我
们把这种链式链接叫做作用域链。(例如下面例一)
运行期上下文:当函数在执行的前一刻,会创建一个称为执行期上下文的内部对象。
一个执行期上下文定义了一个函数执行时的环境,函数每次执行时对应的执行上下
文都是独一无二的,所以多次调用一个函数会导致创建多个执行上下文,当函数执
行完毕,执行上下文被销毁。
查找变量:在哪个函数里面查找变量,就从哪个函数作用域链的顶端依次向下查找。
函数类对象,我们能访问 test.name
test.[[scope]]隐式属性——作用域
GO:全局 Global Object
AO:函数运行时产生 Activation Object
例 function test (){
}
第一次执行 test(); → AO{} //AO 是用完就不要的
第二次执行 test(); → AO{} //这是另外的 AO
例一:
function a (){
function b (){
var bb = 234;
aa = 0;
}
var aa = 123;
b();
console.log(aa)
}
var glob = 100;
a();
0 是最顶端,1 是次顶端,查找顺序是从最顶端往下查
图解:
例子:
理解过程
a 被定义 a.[[scope]] → 0 : GO{}
a 被执行 a.[[scope]] → 0 : aAO{}
1 : GO{}
b 被定义 b.[[scope]] → 0 : aAO{}
1 : GO{}
b 被执行 b.[[scope]] → 0 : bAO{}
1 : aAO{}
2 : GO{}
c 被定义 c.[[scope]] → 0 : bAO{}
1 : aAO{}
2 : GO{}
c 被执行 c.[[scope]] → 0 : cAO{}
1 : bAO{}
2 : aAO{}
3 : GO{}
当 c 执行完后,会干掉自己的 cAO,回到 c 被定义的状态,当 c 再被执行时,会生
成一个新的 newcAO{},其余都一样,因为基础都是 c 的被定义状态
c 被执行 c.[[scope]] → 0 : newcAO{}
1 : bAO{}
2 : aAO{}
3 : GO{}
如果 function a 不被执行,下面的 function b 和 function c 都是看不到的(也不会被执
行,被折叠)。只有 function a 被执行,才能执行 function a 里面的内容
a();不执行,根本看不到 function a (){}里面的内容。
小知识:
1.各大浏览器内核:
IE trident
chrome webkit / blink
firefox Gecko
Opera presto
Safar webkit
2.素数概念:
从1除以他本身能被两个整数整除
3.接收警示框中用户输入的数据
var score = parseInt(window.prompt('input'))
4.能执行符号执行的表达式会自动放弃函数名称
5.typeof 是唯一一个后面跟一个没被声明的变量不报错的,返回undefined,并且为字符串类型
6.构造函数声明采用大驼峰命名规则
7.var a = (1-1,1+1)
打印a结果为2 有逗号隔开的只返回最后一个