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
分享到:
相关推荐
2023-03-31 项目笔记-第一阶段-1.什么是C语言 2.第一个C语言程序 3.数据类型 3.1 数据类型的大小 3.2类型的...变量、常量 4.1 定义变量的方法 4.2 变量的命名 4.2.1 变量是怎么变的 4.3 变量的分类 4.3.1 变量的使用
4. 自动变量:这是局部变量的默认类型,它们在函数调用时自动分配和初始化(如果未显式初始化,则默认为随机值)。 5. 寄存器变量:虽然不常见,但可以通过`register`关键字请求将变量存储在CPU寄存器中,以提高...
4. **复合数据类型变量**:除了基本类型,C语言还有结构体(struct)、共用体(union)等复合数据类型,用于组合不同类型的数据。定义这类变量需要指定其结构或共用体类型。 5. **静态变量与自动变量**:静态变量在程序...
4. 变量:PCTP_HOST - 数据类型:STRING - 描述:PC教导挂件的主机名。该名称在网络中应该是唯一的,并且必须在$HOSTENT数组中定义为一个元素。 - 最小值:无 - 默认值:"PCTP" - 最大值:无 - 访问权限:读写...
Velocity的基本语法:1.变量 2.循环 3.条件语句 4.语句的嵌套 5.注释 .....
4. 变量的初始化(赋值): 声明变量后,必须为其赋予一个初始值才能使用。可以像这样为变量赋值:`int a = 5;`。如果在方法内部声明变量而未初始化,Java会报编译错误。 5. 变量的访问: 可以通过变量名来读取或...
4. 变量名 应该尽可能具有可读性和明确性,以便于程序的阅读和维护。 在 C 语言中,变量名的命名规则非常严格,例如: * 变量名不能以数字开头。 * 变量名中不能包含特殊字符,如!、@、#等。 * 变量名中不能...
4. 变量的定义: - 变量创建:在ODI项目中,可以通过右键菜单新建变量,指定变量名称、数据类型和是否保留历史记录。 - 规则定义:变量的值通常由SQL语句生成,可以在定义时编写SQL规则,这可以是任何合法的ODI ...
4. 变量的访问: 一旦变量被声明并初始化,就可以在程序中通过变量名访问和操作其存储的数据。例如,`int c = a + b`,这里的c就访问了a和b的值,并进行了加法操作。 5. 变量的分类: - 静态变量(类变量):使用...
4. 变量的生命周期: 变量的生命周期取决于它的作用域。在函数内部声明的变量(局部变量)仅在该函数执行期间存在;而在类或结构体中声明的变量(成员变量)在整个对象生命周期内都有效。 5. 成员变量: 成员变量...
4. 变量重要性评估:通过观察各输入变量对应的权重或偏差,判断其对模型输出的影响程度。 5. 变量筛选:根据评估结果,剔除影响较小的变量,重新构建和训练简化后的模型。 6. 模型验证:使用验证数据集检查简化模型...
4. 变量初始化: 初始化是指在声明变量时为其赋予初始值。不初始化的变量可能含有未定义的值,使用这样的值可能会导致不可预测的结果。因此,良好的编程习惯是始终初始化变量。 5. 变量的作用域: 变量的作用域...
4. 变量的设置和显示 变量可以用大小写字母。变量设置时的不同模式包括: * Variable-name=value 设置实际值到 variable-name * Variable-name+value 如果设置了 variable-name,则重设其值 * Variable-name:?...
4. 变量名、类型名、方法名和类名不能是Java关键字。 例如: ```java int a = 100; // 正确的变量名 char _15 = 'A'; // 正确的变量名 long $num = 512l; // 正确的变量名 boolean class_1 = true; // 正确的变量名...
4. 变量名通常应全部使用小写字母,以便提高代码的可读性。 5. 避免使用Python的保留关键字(如`and`, `assert`, `break`等)和内置函数名作为变量名,这可能导致语法错误或功能冲突。 6. 小心区分字母`l`和数字`1`...
4. 变量和参数的介绍 4.1. 变量替换 4.2. 变量赋值 4.3. Bash变量是不分类型的 4.4. 特殊的变量类型 5. 引用(翻译的可能有问题,特指引号) 5.1. 引用变量 5.2. 转义(\) 6. 退出和退出状态 7. Tests ...
4. **局部变量与全局变量**:在函数或过程中声明的变量为局部变量,只在该函数或过程中有效;在全局范围内声明的变量为全局变量,可以在整个脚本中访问。 5. **变量生命周期**:页面级变量在页面执行完毕后被清除,...
4. 变量命名规则: - 标识符只能由字母、数字和下划线组成,且首字符不能是数字。 - 大小写字母被视为不同字符,如`A`和`a`是不同的标识符。 - 标识符长度理论上可以很长,但实际有效长度通常有限制,如32位或64...
4. 变量的概念和声明:变量是程序中存储数据的内存单元,通过变量名可以访问和修改其存储的值。声明变量时,需要指定数据类型和变量名,如`int age`。 5. 变量命名规则:变量名只能包含字母、数字和下划线,且不能...