关于js中变量赋值、变量作用域、变量的赋值变化、函数调用与引用
1. js中Let[空格]变量不赋值和Let[空格]变量=null的区别。
在JavaScript中,使用let声明变量时,如果不对其进行初始化(对变量赋初始值也称为变量初始化),该变量会默认赋予一个undefined值。而将变量显式赋值为null,则表示该变量已被赋予了null值。
这两种情况的主要区别在于它们在后续代码中的表现:
1)未赋值的Let[空格]变量:Let[空格]变量名;
访问变量时会得到undefined,尝试使用变量的属性或方法会得到一个错误,因为undefined和null都不是对象。
2)赋值为null的Let[空格]变量:Let[空格]变量名=null;
访问变量时会得到null,尝试使用变量的属性或方法不会报错,因为null表示变量已有值但该值为空
下面是两种情况的简单示例代码:。
例1)未赋值的Let[空格]变量;
let variable;
console.log(variable); // 输出 undefined
// 尝试访问未定义的属性会报错
// console.log(variable.toString());
例2)赋值为null的Let[空格]变量:
let variable = null;
console.log(variable);
// 输出 null
// 尝试访问null的属性不会报错,但不会有输出
console.log(variable.toString);
// 输出 undefined
使用Let[空格]变量名; 仅声明不赋值,不分配内存地址,而le[空格]变量名=null; 则有指针堆栈的内存地址。
所以,为了避免程序可能报错,一般习惯上变量声明后最好同时赋值。Let[空格]变量=赋值;或 Let[空格]变量=Null(空值,空对象。)或者Let[空格]变量=" "(空字符串值);
2.在程序开头的全局变量声明区或在块{}内(比如函数)开头的变量声明区中,Let[空格]变量名;或Let[空格]变量名=null;只声明不赋值或声明并赋值为null后,之后再下方对变量重新赋值(变量名="x"),可以改变变量作用域(变量提升)。
1)变量前置,Let[空格]变量名=null;在块内(比如函数)的开头变量声明区声明后,再在块(比如函数)的后半部分重新赋值,重新赋值后该变量的值会提升至整个块内自变量声明区之后所有引用该变量的地方。比如在函数后的半段赋值直接赋值(变量名=赋值),就可以在程序的前半段引用,引用可进行空值null判断(变量最好预定义声明为null以方便判断,Let[空格]变量=null;)
2)变量提升,Let[空格]变量名=null;在程序开头的全局变量声明区声明后,再在下面的函数内直接重新赋值后,所赋的值会从函数内的值提升为全局值,可以在函数外,在全局变量声明区之后的任意位置直接引用该变量名使用该值,引用该函数名使用前可根据整个程序函数的执行逻辑进行空值null判断。
3.声明变量,赋值变量
1)Let[空格]变量名;是声明变量。
2)Let[空格]变量名="x"; 是声明并赋值变量。
3)变量名="x"是赋值变量。
4)const,let,var定义变量关键字的区别:cons[空格]变量是在程序开头的全局变量声明区声明赋值全局性常量的关键字,const声明并赋值变量后之后就不可以再重新赋值,作全局变量使用。let是具有作用域的变量,可以声明后同时赋值,也可以先声明之后再赋值,但不能重复声明变量(Let[空格]同变量名="x"),重复声明变量程序会报错,但可以根据情况对变量再次重新赋值(直接引用变量名="x"),可以作全局变量(程序开头全局变量声明区内声明并赋值后作用于整个程序),也可以作局部变量(在块{}内或函数内声明并赋值仅作用于块{}内或函数内),还可以作变量提升(在程序开头全局变量声明区中仅声明变量名或是声明变量名并赋值为null后,再在之后程序的后半段对变量进行赋值,赋值后该值将提升为该变量在全局的变量值;或者是,在块内{}的开头部分声明并赋值为null,之后再在块内{}的后半部分再次赋值,赋值后该值将提升该变量自变量声明之后的整个块内,但使用前需进行空值null判断,初次执行该块时在变量重新赋值前该变量值为null,再次执行该块时在重新赋值前该变量的值变为上次执行该块时所重新赋值时的值)。var是原有js的变量声明关键字,规则很宽松,可以重复声明变量(var[空格]同变量名="x"),不会报错,但不具有变量提升功能。
三种定义变量的关键字无论哪一种,在变量未声明前都不可以提前引用。未声明变量前不可以提前使用变量。
4.全局变量与局部变量的赋值变化
全局变量在程序开头的变量声明区进行声明赋值后,在程序加载时会一次性赋值,直到程序结束,全局变量的值静态的(除了具有全局变量提升的变量外)。
局部变量(比如函数内的变量),在函数内声明并赋值的变量,每次执行该函数时声明的变量值都会动态更新。比如时间、坐标、引用其它函数的存储数据等都会随着函数的再次执行而进行动态更新。
所以,除了多个块(如函数)需要共用同一个常值的变量(const[空格]常量名=常量或Let[空格]变量名=常值)及需要将局部变量提升为全局的变量(let[空格]=null或Let[空格]变量名)会在程序的开头全局变量声明区声明赋值外,一般某个块{}(如函数)需要单独使用的变量最好是在块{}(如函数)内的开头变量声明区进行声明(如需要也一并赋值),以便调用函数时变量值会随之动态更新。
5.函数的调用与引用
1)函数的调用:
funcname();即函数名加括号;表示函数立即执行(处理)并返回处理结果(如果有return值则返回值),用在程序执行时需要立即调用并执行函数(若需要返回执行结果则立即返回结果)的地方。
2)函数的引用:
funcname,即只有函数名没有括号,表示指向该函数的位置,在条件满足时才调用并执行该函数(其返回结果显示为包含了函数名加(){}内部所有代码的整个函数表达式),用在需调用事件监视器及计数器、定时器等方法上,如setTimeout(funcname,1000); document.addEventListener("click",funcname);