1 变量提升:将var web;提到最前面执行,无论其所在语句是否执行,在一开始便会预执行声明变量部分(不预执行所在语句的赋值部分)
function hd() {
if (false) {
var web = "houdunren.com";
}
console.log(web);
}
hd();
即使if(false)语句并未执行,仍可在console中打出web为undefined类型,证明var web;语句被提前执行
2 let/const暂时性死区TDC:使用let/const声明变量,必须在声明后再使用此变量,先使用后声明会报错。建议用let/const替代var声明。
3 var let const的相同点:
var/let/const变量在全局声明且赋值过后,在私有区域再次声明并赋值可改变私有领域此变量的值,不改变全局变量的值,若在私有领域未再次声明,直接赋值,改变的是全局变量。
4 变量必须声明,否则易造成全局污染。
5 块作用域:在块作用域中使用let/const,使用var时需建立函数作用域来隔绝私有领域与全局领域
var无法隔绝块作用域,会改变全局变量的值,换成let便可(但var可重复定义,let/const不可以)
调用js时,若声明变量用var,需建立一个执行函数来隔绝私有领域和全局领域,形成一个函数作用域,在私有领域里面用var声明的变量是无法访问到的,需使用bind.window()进行调用,此时使用作用域中为url开发的接口$.getUrl()才可访问到url的值
(function() {
var $ = (window.$ = {});
$.web = "hdcms";
var url = "hdcms.com";
var site = "后盾人";
$.getUrl = function() {
return url;
};
}.bind(window)());
若用let声明变量,则可直接用花括号建立块作用域,但同样也要使用$.getUrl()来访问url的值
{
let $ = (window.$ = {});
$.web = "hdcms";
let url = "hdcms.com";
let site = "后盾人";
$.getUrl = function() {
return url;
};
}
6 const常量声明:所声明的变量在同个作用域中不可更改(let可以更改),若想更改其值,需建立函数作用域将其私有化,在作用域内可拥有新的值