作用域一般来说ES5:function var 跟作用域有关,当函数调用时有以下执行步骤:
1.先进行扫描(预编译)扫描的时候会把内部的所有var和function修饰的标识符加到一个对象中去==>AO
2.在运行脚本
函数再运行时如何产生应该作用域:
1.先把内部变量和形参声明了(变量不赋值,形参赋值实现数据)
2.然后把函数隐式的做提升,函数提升会把脚本一起做提升
3.按照函数体内部的代码逻辑(js的单线程执行任务)执行代码
4.函数被调用时 是在它声明的地方(作用域去执行代码)
经典例题:
<script>
function fun(n, o) {
console.log(o)
return {
fun: function(m) {
return fun(m, n);
}
};
}
var a = fun(0);//unde
a.fun(1);//0
a.fun(2);//0
a.fun(3);//0
var b = fun(0).fun(1).fun(2).fun(3);//und 0 1 2
var c = fun(0).fun(1);//und 0
c.fun(2);//1
c.fun(3);//1
</script>
分析:
如 fun(0).fun(1).fun(2).fun(3)
这种调用每一个调用完毕以后会在全局作用下去生成AO对象 但是实参取值是在局部作用域下取值 因此打印结果是unde 0 1 2
如 a.fun(1); a.fun(2);a.fun(3);
a.fun(1)这个调用会在上一个AO对象中取实参 在全局GO对象生成AO作用域对象
a.fun(2);这个调用也会在上一个AO对象中取实参 在全局GO对象生成AO作用域对象
a.fun(3);这个调用也会在上一个AO对象中取实参 在全局GO对象生成AO作用域对象
var a = fun(0);//这种调用生成了一个AO对象
这种程序题 怎么做笔试题?
1.这个题主要考察我是否会js中作用域,在js中函数调用时会生成作用域对象来存储局部标识
2.函数调用时先去访问这个函数的引用 然后去它声明的作用的对象下执行代码生成AO对象
总结:作用域嵌套会导致程序分析起来比较麻烦 因此做项目时尽量采用同级作用域的方式