块作用域由{ }包括, let和const具有块级作用域,var不存在块级作用域。块级作用域解决了两个问题
var 存在变量提升,let和const 不存在变量提升,也就是变量只能在声明之后使用,如果不在就会报错
浏览器的全局对象是window,Node的全局对象是global,var 声明的变量是全局变量,并且会将该变量添加为全局对象的属性,但是let和const 不会
var声明变量时,可以重复声明变量,后声明的同名变量会覆盖之前声明的变量,但是const 和let 是不允许重复声明的
在使用let ,const 声明变量之前,该变量都是不可用的,这在与发生称为暂时性死区,使用var 声明的变量并不存在暂时性死区
在声明变量的时候,var 和const 可以不用设置初始值,但是const变量必须设置初始值
let和const都是ES6新增的用于创建变量的语法。let创建的变 量是可以更改指针指向(可以重新赋值)。但const声明的变 量是不允许改变指针的指向。
区别 |
var |
let |
const |
是否有块级作用域 |
× |
√ |
√ |
是否存在变量提升 |
√ |
× |
× |
是否能添加全局属性 |
√ |
× |
× |
是否能重复声明变量 |
√ |
× |
× |
是否存在暂时性死区 |
× |
√ |
√ |
是否必须设置初始值 |
× |
× |
√ |
能否改变指针指向 |
√ |
√ |
× |
const保证的并不是变量的值不能改动,而是变量指向的那个内存地址不能改动。对于基本类型的数据(数值、字符串、布尔值),其值就保存在变量指向的那个内存地址, 因此等同于常量。但对于引用类型的数据(主要是对象和数组)来说,变量指向数据的内存地址,保存的只是一个指针, const只能保证这个指针是固定不变的,至于它指向的数据结构是不是可变的,就完全不能控制了。
function objectFactory(){
let newObject = null;
let constructor=Array.prototype.shift.call(arguments);
let result=null;
//判断参数是否是一个函数
if(typeof constructor !="function"){
console.error("type error");
return;
}
//新建一个空对象,对象的原型是构造函数的prototype 对象
newObject =Object.create(constructor.prototype);
//将this 指向新建对象,并执行函数
result = constructor .apply(newobject, arguments);
//判断返回结果
return flag ? result : newObject;
}
//使用方法
objectFactory(构造函数,初始化参数);
箭头函数是ES6中的提出来的,它没有prototype, 也没有自己的this指向,更不可以使用arguments参数, 所以不能New-一个箭头函数。箭头函数是ES6中的提出来的,它没有prototype, 也没有自己的this指向,更不可以使用arguments参数, 所以不
能New-一个箭头函数。
new操作符的实现步骤如上所述,
所以,上面的第二、三步, 箭头函数都是没有办法执行的。
let fn = ( ) => void doesNotReturn( );
箭头函数不会创建自己的this,所以它没有自己的this,它只会在自己作用域的上一层继承 对象obj的方法b是使用箭头函数定义的,这个函数中的this就永远指向它定义时所处的全局执行环境中的this,即便这个函数是作为对象obj的方法调用,this依旧指向Window对象。 需要注意,定义对象的大括号{}是无法形成一个单独的运行环境的,它依旧是处于全局执行环境中 构造函数在new的步骤在上面已经说过了,实际上第二步就是将函数中的this指向该对象。但是由于 箭头函数时没有自己的this的,且this指向外层的执行环境,环能改变指向,所以不能当做构造函数使用。 箭头函数没有自己的arguments对象。在箭头函数中访问arguments实际上获得的是它外层函数的arguments值。 恭喜你,又涨知识啦~~ 现在正在期待一个月满我可以改名字,~ 箭头函数继承来的this指向永远不会改变
var id='GLOBAL';
var obj={
id:'OBJ',
a:function(){
console.log(this.id);
},
b:()=>{
console.log(this.id);
}
};
obj.a();//'OBJ'
obj.b();//'GLOBAL'
new obj.a() //undefined
new obj.b() //uncaught TypeError:obj.b is not a constructor
箭头函数不能作为构造函数使用
箭头函数没有自己的arguments
箭头函数没有prototype
箭头函数不能用作Generator函数,不能使用yeild关键字