作用域链:调用对象全局对象 依次执行代码: alert(scope)
局部变量和全局变量同名时,会隐藏这个全局变量;
4.变量
关键字: 4.变量
4.1 变量的类型
JS是松散类型的语言
4.2 变量的声明
var 声明是变量的标准声明
var 声明的变量是永久性的,不能用delete运算符删除
全局东西,挪用东西初始化时,JS解析器会在相应的代码段里寻找var声明的变量,
然后在全局东西,挪用东西中创建相应的属性,此时它是未赋值的(undefined),
当措施执行到相应的var声明代码段时才会给相应东西的属性赋值
反复的声明:按照以上var声明感化的理解,反复的var声明不会造成任何错误,
var声明只是便利创建全局东西,挪用东西的属性,代码只是赋值用的
遗漏的声明:给未声明的变量赋值,JS会隐式声明全局变量(在全局东西中增加相应的属性),然后给其赋值
4.3 变量的感化域
全局变量,局部变量
局部变量和全局变量同名时,会隐藏这个全局变量
4.3.1 没有块级感化域
函数中声明的变量,无论在哪里声明的,在整个函数中它们都是有界说的
4.3.2 未声明的变量和未赋值的变量
alert(u);会孕育产生一个错误--使用未声明的变量会孕育产生一个错误
var u;alert(u);会跳出undefined---使用未赋值的变量,使用的它的默认值undefined
4.4 根基类型和引用类型
第三章已经讲过
4.5 垃圾收集
同java
4.6 作为属性的变量
4.6.1 全局东西
JS解释器开始运行时,在执行任何JS代码前,会创建一个全局东西,这个东西的属性就是JS全局变量,
并初始化为undefined
var声明一个JS全局变量时,实际上就是界说了一个全局东西的属性,
JS解释器还会用预界说的值和函数来初始化全局东西的许多属性,如:Infinity parseInt Math
非函数内部可以用this来引用这个全局东西
客户真个JS中,Window东西代表浏览器窗口,它包罗该窗口中的所有JS代码的全局东西,具有自我引用的window属性
4.6.2 局部变量:挪用东西
函数的局部变量存放在挪用东西的属性
挪用东西是一个完全独立的东西,所以可以防备笼罩同名的全局变量
4.6.3 JS的执行环境
JS解释器执行一个函数时,会创建一个执行环境
JS允许同时存在多个全局执行环境,如:JS客户真个ifame的情况
4.7 深入理解变量感化域
每个JS执行环境都有一个和它相关联的感化域链它是一个东西列表或东西链.
盘问x:变量名解析(variable name resolution)的过程,它开始检察感化域链的每一个东西,
如果有,返回值,如果没有继续盘问下一个东西,以些类推.
感化域链的优先级:嵌套函数的挪用东西>挪用东西>全局东西
按照以上理解说明JS初始化的过程:
在JS解释器执行任何代码之前,创建全局东西
用预界说的值和函数来初始化全局东西中的属性,eg.Math,Infinity,parseInt
搜索函数外的var声明,创建全局东西相应的属性,初始化为undefined
创建全局的执行环境,感化域链只有一个东西-全局东西
依次执行代码
遇到var声明赋值语句给全局东西相应的属性赋值
遇到未声明赋值语句,在全局东西中增加相应的属性,并赋值
遇到函数挪用,创建挪用东西
搜索函数中的var声明和参数,创建挪用东西相应的属性,初始化为undefined
创建函数执行环境,感化域链--第一东西:挪用东西;第二东西:全局东西
依次执行代码
遇到var声明赋值语句给挪用东西相应的属性赋值
遇到未声明赋值语句,在全局东西中增加相应的属性,并赋值
遇到函数挪用,创建嵌套函数的挪用东西
搜索嵌套函数中的var声明和参数,创建嵌套函数的挪用东西相应的属性,初始化为undefined
创建嵌套函数执行环境,感化域链--第一东西:嵌套函数的挪用东西;第二东西:挪用东西;第三东西:全局东西
依此类推
eg1.
var scope="global";
function f(){
alert(scope);
var scope="local";
alert(scope);
}
f();
过程:
创建全局东西,搜索函数外的var声明语句,在全局东西中创建scope属性,scope=undefined
创建全局的执行环境,感化域链只有一个东西:全局东西
依次执行代码:
var scope="global"时,变量名解析开始,在全局东西属性中查找scope属性
把"global"赋给scope
遇到函数挪用:创建挪用东西
搜索函数中的var声明语句和参数,在挪用东西中创建scope的属性,scope=undefined
创建函数执行环境,感化域链:挪用东西>全局东西
依次执行代码:
alert(scope),盘问scope,变量名解析,先搜索挪用东西,找到scope属性,其值为undefined,执行
var scope="local",盘问scope,变量名解析,先搜索挪用东西,找到scope属性,scope="local"
alert(scope),盘问scope,变量名解析,先搜索挪用东西,找到scope属性,其值为"local",执行
eg2.
var scope="global";
function f(){
alert(scope);
scope="local";
alert(scope);
}
f();
过程:
创建全局东西,搜索函数外的var声明语句,在全局东西中创建scope属性,scope=undefined
创建全局的执行环境,感化域链只有一个东西:全局东西
依次执行代码:
var scope="global"时,变量名解析开始,在全局东西属性中查找scope属性
把"global"赋给scope
遇到函数挪用:创建挪用东西
搜索函数中的var声明语句和参数,没有找到var声明语句
创建函数执行环境,感化域链:挪用东西>全局东西
依次执行代码:
alert(scope),盘问scope,变量名解析,先搜索挪用东西,没找到scope属性,再搜索全局东西,找到scope属性,其值为"global"执行
scope="local",盘问scope,变量名解析,先搜索挪用东西,没找到scope属性,,再搜索全局东西,找到scope属性,scope="local"
alert(scope),盘问scope,变量名解析,先搜索挪用东西,没找到scope属性,再搜索全局东西,找到scope属性,其值为"local",执行
eg3.
scope1="global";
alert(scope1);
function f(){
alert(scope2);
scope2="local";
}
f();
过程:
创建全局东西,没有找到var声明语句,没有自界说的全局东西属性
创建全局的执行环境,感化域链只有一个东西:全局东西
依次执行代码:
scope1="global"时,变量名解析开始,感化域链是没有找到scope1属性,在全局东西属性中创建scope1属性,并赋值为"global"
alert(scope1)时,变量名解析开始,感化域链是找到scope1属性,其值为"global",执行
遇到函数挪用:创建挪用东西
搜索函数中的var声明语句和参数,没有找到var声明语句
创建函数执行环境,感化域链:挪用东西>全局东西
依次执行代码:
alert(scope2),盘问scope2,变量名解析,感化域链是没有找到scope2属性,报错scope2 is not defined
函数
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/31070.html