<script>
// 1.不能重复声明
var a ="aaa";
var a="bbb";
console.log(a);
let b ="111";
//let b ="222"; //控制台报错:ncaught SyntaxError: Identifier 'b' has already been declared
console.log(b);
//2.没有变量名提升
console.log(box); //undefined
var box="box";
//console.log(box2);
let box2="box2";//控制台报错:Uncaught ReferenceError: Cannot access 'box2' before initialization
//3.有块级作用域
for(var i=0;i<2;i++){
}
console.log(i);
for(let j=0;j<2;j++){
}
console.log(j);//控制台报错:Uncaught ReferenceError: j is not defined
var a=1;
if(a==1){
let b=3;
var d=4;
}
// console.log(b);//报错
console.log(d); //4
</script>
3.const关键字
const 关键字 声明的变量 不能重复声明
const 关键字 声明的变量 没有变量声明提升
const 关键字 声明的变量 有块级作用域
const 关键字 声明的变量 是常量,不允许修改
例如:
// 1.不能重复声明
var a ="aaa";
var a="bbb";
console.log(a);
const x ="111";
//const x ="222"; //控制台报错:Uncaught SyntaxError: Identifier 'x' has already been declared
console.log(x);
//2.没有变量名提升
console.log(box); //undefined
var box="box";
//console.log(box22);
const box22="box2";//控制台报错:Uncaught ReferenceError: Cannot access 'box22' before initialization
//3.有块级作用域
for(var i=0;i<2;i++){
var p=0;
}
console.log(p);
for(var j=0;j<2;j++){
const k=0;
}
//console.log(k);//控制台报错:Uncaught ReferenceError: k is not defined
//4.是常量,不允许修改
let cbox="1111";
cbox="22222";
console.log(cbox);
const cbox2="aaaa";
//cbox2="bbbb"; //报错提示:Uncaught TypeError: Assignment to constant variable.
console.log(cbox2);
const URL = "127.0.0.1:3000";
// 报错提示:Uncaught TypeError: Assignment to constant variable.
// 常量的值不允许修改
// if(URL = "127.0.0.1:8080"){
// console.log("进入判断,执行代码");
// }
//用于写进判断语句的变量可以用const声明,避免造成赋值的情况
//当const是引用数据类型时,需要注意,他依然是没有修改arr的值,arr的值依然是同一个地址:
const arr=[1,2,3,4];
arr[0]=99;
console.log(arr);
var adder = {
base : 1,
add : function(a) {
var f = v => v + this.base;
return f(a);
},
addThruCall: function(a) {
var f = v => v + this.base;
var b = {
base : 2
};
return f.call(b, a);
}
};
console.log(adder.add(1)); // 输出 2
console.log(adder.addThruCall(1)); // 仍然输出 2
// 常规写法
var greeting = () => {let now = new Date(); return ("Good" + ((now.getHours() > 17) ? " evening." : " day."));}
greeting(); //"Good day."
console.log(now); // ReferenceError: now is not defined 标准的let作用域
// 参数括号内定义的变量是局部变量(默认参数)
var greeting = (now=new Date()) => "Good" + (now.getHours() > 17 ? " evening." : " day.");
greeting(); //"Good day."
console.log(now); // ReferenceError: now is not defined
// 对比:函数体内{}不使用var定义的变量是全局变量
var greeting = () => {now = new Date(); return ("Good" + ((now.getHours() > 17) ? " evening." : " day."));}
greeting(); //"Good day."
console.log(now); // Fri Dec 22 2017 10:01:00 GMT+0800 (中国标准时间)
// 对比:函数体内{} 用var定义的变量是局部变量
var greeting = () => {var now = new Date(); return ("Good" + ((now.getHours() > 17) ? " evening." : " day."));}
greeting(); //"Good day."
console.log(now); // ReferenceError: now is not defined
箭头函数也可以使用闭包:
// 标准的闭包函数
function A(){
var i=0;
return function b(){
return (++i);
};
};
var v=A();
v(); //1
v(); //2
//箭头函数体的闭包( i=0 是默认参数)
var Add = (i=0) => {return (() => (++i) )};
var v = Add();
v(); //1
v(); //2
//因为仅有一个返回,return 及括号()也可以省略
var Add = (i=0)=> ()=> (++i);
一种特别的编码方式
// ES6
let foo = x => y => r => {
return {
x,
y,
r
}
}
var obj = foo("110px")("220px")("330px");
console.log(obj);
// 这种函数的编码方式的函数,称之为柯里化函数
// 也是闭包的一种体现
// 换成ES5的代码
var foo2 = function (x) {
return function (y) {
return function (r) {
// 书写处理逻辑
return {
x,
y,
r
}
}
}
}
var option = foo2("1px")("2px")("3px");
console.log(option);