console.log(num);//undefinedvar num =10;// 在代码执行之前,这个变量被提升到代码最前面,但是并未被赋值,所以打印的时候是undefined
作用域
什么是作用域?就是一个变量可以生效的范围
变量不能再任何地方使用的,而可以使用该变量的就是变量的作用域
作用域分为全局作用域和局部作用域
全局作用域
全局作用域是最大的作用域
在全局作用域中定义的变量可以在任何地方使用
页面打开的时候,浏览器会自动给我们生成一个全局作用域windows
全局作用域会一直存在,直到页面关闭才销毁
// 在页面任何一个地方都可以使用var num1 =100;var num2 =200;
局部作用域
在js中只有函数里才能出现局部作用域
局部作用域中定义的变量只能在局部作用域中使用
每一个函数都是一个局部作用域
functionfn(){var num =10;
console.log(num);}// 局部作用域的作用范围只能在函数中使用,所以这里打印is no defined
console.log(num);
变量使用规则
有了作用域之后,变量就有了使用范围和使用规则
变量使用规则分为两种: 范围规则和赋值规则
访问规则
当我想获取一个变量的时候,我们称这个行为叫做访问
获取变量的规则
首先,在自己作用域内部查找,如果有,就直接拿来使用
如果没有,就去上一级作用域查找,如果有,直接拿来使用
如果没有,就继续向上一级作用域查找,依次类推
如果一直查找到全局作用域都没有这个变量,那么就会直接报错 is no defined
var a =1;functionpoo(){var num1 =100;functionfoo(){var num2 =200;
console.log(num1);//自己作用域没有向上一层查找
console.log(num2);//自己作用域有直接拿来用
console.log(a);//一直查找到全局作用域
console.log(num3);//全局作用域没有,就直接报错 is no defined}foo();}poo();
作用访问规则,又叫作用域查找机制
作用域查找机制,只能由内向外,不能由外向内
functionfn(){var num =100;}
console.log(num);//无法找到num
赋值规则
当你想要给一个变量赋值的时候,我们需要先找到这个变量在给它赋值
变量赋值规则
先在自己的作用查找变量,查找到之后直接赋值
没有的话就向上一级作用域查找,有就直接赋值
直到找到全局作用域,如果还没有找到的话,js会将这个变量变为伪全局变量
functionfn(){
num =100;}
console.log(num);//这里的num变成了伪全局变量,可以访问到