最好网站建设公司制作平台,wordpress外贸站,建立本机网站,百姓网推广电话作用域 通常来说#xff0c;一段程序代码中所用到的名字并不总是有效和可用的#xff0c;而限定这个名字的可用性的代码范围就是这个名字的作用域。作用域的使用提高了程序逻辑的局部性#xff0c;增强了程序的可靠性#xff0c;减少了名字冲突。
作用域分为全局作用域和局…作用域 通常来说一段程序代码中所用到的名字并不总是有效和可用的而限定这个名字的可用性的代码范围就是这个名字的作用域。作用域的使用提高了程序逻辑的局部性增强了程序的可靠性减少了名字冲突。
作用域分为全局作用域和局部作用域。
es6的时候新增了块级作用域{ }。
全局变量和局部变量 根据作用域的不同变量也可分为全局变量和局部变量。 全局变量在全局作用域下声明的变量在全局都可以使用。 在全局作用域下var声明的变量是全局变量如果在函数内部没有声明直接赋值的变量也属于全局变量不建议使用 局部变量在局部作用域下声明的变量在函数内部定义的变量只能在函数内部使用。 在函数内部var声明的变量就是局部变量 二者区别 全局变量在任何一个地方都可以使用只有在浏览器关闭时才会被销毁因此比较占内存 局部变量只在函数内部使用当其所在的代码块被执行时会被初始化当代码块运行结束后就会被销毁因此更节省内存空间。
作用域链 内部函数访问外部函数的变量采取的是链式查找的方式来决定取哪个值这种结构我们称为作用域链 就近原则
下面这个代码就近原则输出的是20。 预解析
js引擎分为两步预解析 代码执行
1预解析 js引擎会把 js中所有的 var 还有function 提升到当前作用域的最前面
2代码执行 按照代码书写的顺序从上往下执行 预解析分为变量预解析变量提升和函数预解析函数提升
变量预解析
变量提升 就是把所有的变量声明提升到当前的作用域最前面不提升赋值操作。
console.log(num)
var num10;//相当于执行了以下代码var num; //预解析把变量声明提升上来
console.log(num);
num10; //赋值不提升 上面这段代码预解析时会把变量声明提升到最前面但不提升赋值操作所以上面那个代码console.log(num)时num还没有被赋值会输出undefined。 注意函数表达式是用一个变量存储函数的预解析时只提升变量声明不提升变量赋值。所以函数表达式调用必须要写在函数表达式的下面不然会出错。
// 函数表达式 调用必须要写在函数表达式的下面
fun(); //所以这里会输出undefined
var funfunction(){console.log(22);
}//相当于执行了以下代码
var fun; //提升了变量声明
fun();
funfunction(){ //变量赋值不提升console.log(22);
}
函数预解析
函数提升 就是会把函数声明提升到当前作用域最前面不提升调用操作。
fn();
function fn(){console.log(22)
}//预解析
//相当于执行下面的代码所以不会报错
function fn(){ //函数声明console.log(22)
}
fn(); //函数调用
一道易错题
f1();
console.log(c);
console.log(b);
console.log(a);
function f1(){var abc9;console.log(a);console.log(b);console.log(c);
}// 预解析
//相当于以下代码
function f1(){ //把函数声明提升var a; //变量提升a9;b9;c9;console.log(a);console.log(b);console.log(c);
}
f1(); //调用f1()输出9 9 9
console.log(c);
console.log(b);
console.log(a);//外面输出的是 9 9 undefined
这道题易错点是 var abc9; 相当于var a9;b9;c9; 而不是集体声明集体声明应该为 var a9,b9,c9;
因为在函数内部没有声明直接赋值的变量也属于全局变量所以b和c是全局变量。a是在函数内部声明的所以a是局部变量。