2021/1/26

发布于 2021-1-26 16:49:13 字数 3271 阅读 398 分类

var t,y,u //声明但没有赋值
var a=10 //函数外为全局变量
z=“oidof”//隐式的全局变量
function test(){
var b=5;//函数内 使用var 声明为局部变量
c=10;//函数内 不声明,直接赋值视为全局变量
var test2=function(){
b +=b+c
}
ff=function(){//函数内 不使用 var 声明,直接赋值视为全局变量
return 100
}

alert(b)//20
}

alert(a)//10
alert(b)//提示语法错误,找不到变量
console.log(ff) //100

var的语句使用是有限制的,它不能在循环或条件结构中使用。

错误用法
while(var i=0,(i++)<10){

}

if(var i=false){
alert(i)
}

但是,可以在for 或for/in结构的条件表达式中使用
for(var i=0;i<10;i++){
alert(i)

}

for(var i in document){
alert(i)

}

定义在函数中的参数和变量在函数外部是不可见的,且在一个函数中的任何位置定义的变量在该函数中的任何地方都可见

避免变量污染,推荐在程序中创建唯一一个全局变量,推荐用法

var My={};
MY.name={
“firest-name”:“firest”,
“last-name”:“last”
}
My.work={
number:123,
one:{
name:“one”,
city:“beijing”
}

}
只要把多个全局变量追加在一个名称空间下,就可以降低与其它应用程序产生冲突然袭击的机率,应用程序也会变量更容易
阅读

es6新增, ES6声明的变量不会挂在顶层对象
let 块级作用域 不存在变量提升 暂时性死区 不可重复声明
const 声明之后必须立马赋值,否则会报错;声明了简单的数据类型就不能更改了;声明了引用类型(数组,对象等),指针指向的地址不能更改,但内部的数据可更改的

区别

  1. 块级作用域
    for(var i = 0; i < 3; i++) {
    setTimeout(() => {
    console.log(i); // 输出3个3
    }, 0)
    }
    解析:变量i是var声明的,在全局范围内是都有效,全局只有一个变量i。每次循环,变量的值会发生改变。循环内的i是指向全局的i。

for(let i = 0; i < 3; i++) {
setTimeout(() => {
console.log(i); // 输出0, 1, 2
}, 0)
}
解析:变量i是let声明的,当前的i只在本轮循环有效,所以每次循环的i其实都是一个新变量。JavaScript引擎内部会记住上一轮的值,初始化本轮的变量i时,就在上一轮循环的基础上进行计算。

  1. 不存在变量提升
    console.log(a); // undefined
    var a = 100;
    var命令会发生变量提升现象,即变量可以在声明之前使用,值为undefined;而let纠正了这种行为,不能产生变量提升。

console.log(a); // 报错
let a = 100;

  1. 暂时性死区
    只要块级作用域内,存在let命令,它所声明的变量就绑定(binding)在这个区域,不再受外部影响。

如:
var temp = 123;
if(true) {
temp = ‘abc’; // 引入错误
let temp;
}

在上面中,if后面的大括号内容就形成了一个区域。而temp此时是找不到外层的,因为内部有个temp且你在内部let temp声明前赋值了。

在看一个隐晦的例子:
function bar(x = y, y = 2) {
return [x, y]
}
bar(); // 报错

在上面的例子中bar里面进行赋值操作的时候,就产生了一个封闭的区域了,可以认为x 和 y通过let声明,可是上面的问题是,x = y的引用在y = 2的声明之前。

可以修正如下:
function bar(y = 2, x = y) {
return [x, y];
}
bar(); // [2, 2]

  1. 不可重复声明
    var a = 100;
    var a = 1000;
    console.log(a); // 1000

let a = 100;
let a = 1000; // 报重复声明错误

  1. ES6声明的变量不会挂在顶层对象
    嗯~ES6变量的声明是指哪些声明呢?

指let, const, import, class声明。

而var, function声明是ES6之前的。

所以目前JavaScript有六种声明变量的方式了~
var job = ‘teacher’;
console.log(window.job); // teacher

let job = ‘teacher’;
console.log(window.job); // undefined

const命令注意点
1.let可以先声明稍后赋值;而const声明之后必须立马赋值,否则会报错

let a;
a = 100; // this is ok

const a; // 报没初始化数据的错误

2.const声明了简单的数据类型就不能更改了;声明了引用类型(数组,对象等),指针指向的地址不能更改,但是内部的数据可以更改的
const str = ‘this is a string’;
str = ‘this is another string’; // 报了个“给不变的变量分配值”的错误

const obj = {
name: ‘jia’
}
obj.name = ‘ming’; // this is ok
obj = {}; // 报了个“给不变的变量分配值”的错误

let和const的使用场景
1.let使用场景:变量,用以代替var
2.const使用场景:常量、声明匿名函数、箭头函数的时候。

/ 常量
const PI = 3.14;

// 匿名函数
const fn1 = function() {
// do something
}

// 箭头函数
const fn2 = () => {
// do something
}

收藏
分享
评论 0
关于作者

nedncs

标签云
统计信息

文章总数:188

累计访问: 次

今日访问: 次

在线人数: 人