JavaScript最初由Netscape的Brendan Eich设计,最初将其脚本语言命名为LiveScript,后来Netscape在与Sun合作之后将其改名为JavaScript。JavaScript最初受Java启发而开始设计的,目的之一就是“看上去像Java”,因此语法上有类似之处,一些名称和命名规范也借自Java,但JavaScript的主要设计原则源自Self和Scheme。JavaScript与Java名称上的近似,是当时Netscape为了营销考虑与Sun微系统达成协议的结果。微软同时期也推出了JScript来迎战JavaScript的脚本语言。
JavaScript中变量的定义:
举例:使用var再一个函数内定义一个变量时,就意味着该变量在函数结束退出时被销毁!
function test(){
var testone = 'hi'
// console.log(lqj);
}
test();
console.log(testone);
function test(){
testone = 'hi'
// console.log(lqj);
}
test();
console.log(testone);
如果将var去掉此变量名将会成为全局变量,也就是或以后在后面再写代码是遇到需要使用此变量的时候可以,先调用后,即可对此变量名进行一系列的操作!
如果在开发中为零方便一次定义多个变量,用逗号将所有的要定义的变量名隔开(如下:)
var qqq=1,
lll=2,
www=3;
console.log(qqq+'\n'+lll+'\n'+www)
function lqj(){
console.log(qqq);
var qqq=26;
}
lqj();
这样运行时是不会报错的,因为ES将它自动看成了,如下(声明提升!)
function lqj(){
var qqq=26;
console.log(qqq);
}
lqj();
let与var声明变量时是差不多的,但是了let声明的范围是块作用域内,而var声明的范围是函数作用域内!
举例:
var:因为声明的范围为函数作用域所以,第二个console.log也可以运行
if (true){
var age=26;
console.log(age);
}
console.log(age);
let:因为声明的范围为块作用域所以,第二个console.log不可以运行
if (true){
let age=26;
console.log(age);
}
console.log(age);
因为声明let时,let不会像var那样自己进行声明提升,所以有时在开发时候会形成一个暂时性死区(js中定义的let变量不运行或报错!)
如下:
let:
console.log(lqj);
let lqj = 26;
let在全局变量作用域中声明的变量不会成为window对象属性:
let lqj = 26;
console.log(window.lqj);
而var则可以!!!
var lqj = 26;
console.log(window.lqj);
在for循环中使用var来定义一个变量时会出现此变量渗透到循环体外部的问题!(如下:)
for (var i = 0;i < 5;i++){
// setTimeout(()=> console.log(i))
}
console.log(i)
如果将var关键字改为let的话就不会存在这个问题! (如下:)
for (let i = 0;i < 5;i++){
// setTimeout(()=> console.log(i))
}
console.log(i)
在for循环中用let定义一个变量名时,不会出现渗透到循环体以外的情况,如上图所示,循环体以为的操作对循环题内用let定义的i,是无效的!
var:
for (var i = 0;i < 5;i++){
setTimeout(()=> console.log(i))
}
用var变量来实现一个迭代变量的循环导出时会出现以上的bug!!!
let:
for (let i = 0;i < 5;i++){
setTimeout(()=> console.log(i))
}
用let来处理循环中的迭代导出时则不会出现此bug!!!