1、const与let:
const声明的变量必须直接初始化且不允许二次赋值;
let关键字和var一样,let也用于声明变量;
var声明的变量和let声明的变量有何不同:
a、全局作用域:let声明的变量不会作为全局对象window的属性,而var声明的变量则可以
b、函数作用域:和var一样,都用于声明变量,此时两者没有区别:
但是有些window里面已有的变量在使用console.log(window.变量名)时,会有输出值
c、语句块作用域:let声明的变量只能用于语句块作用域内,而var声明的变量还可以在语句块作用域外使用
d、重复声明:let不能重复声明变量(与Java语言中相似),var则可以
2、匿名函数:
没有函数名的函数称为匿名函数;其格式为:()();
比如: (function (x,y){console.log(x+y);})(1,1)
第二个小括号是向函数中传递的值;
3、变量提升和函数提升:
变量提升:
比如:var name='Tom';
(function(){
console.log(name);//输出undefined,为什么?
var name='Tim';
})();
其实在浏览器中会进行变量提升,如下:
var name='Tom';
(function(){
var name;
console.log(name);
name='Tim';
})();
函数提升:
print();//方法定义在下面,但为什么可以这样被调用呢?
function print(){
console.log("Tom");
};
其实在浏览器中会进行函数提升,如下:
function print(){
console.log("Tom");
};
print();
在JavaScript中,函数定义式声明的函数会被提升到最顶部执行,变量式声明的函数则不会,如下代码:
print();//程序运行,该行代码报错:"Uncaught TypeError: undefined is not a function"
var print = function (){
console.log("Tom");
};
4、闭包:
在javascript中,闭包指定义在一个函数内的函数,该函数可以使用其所在函数中定义的变量(内函数可以使用外函数的变量),如下:
function add(x) {
return function(y) {
return x + y;
};//该匿名函数既是闭包,可以使用外函数中的变量x
}
var result = add(4)(2);//x=4,y=2
console.log(result);
5、箭头函数:
举例说明:
传统函数:
function add(a,b){
return a+b;
}
箭头函数:
var add = (a,b)=>{
return a+b;
}
箭头函数注意事项:
a、如果函数体只有一行代码,则函数大括号可以省略,如果该行代码用于返回结果,return必须忽略
注意:一个=,一个=> 如下例子:
function print(){
console.log("Tom");
}
var print = ()=>console.log("Tom");
b、箭头函数是匿名函数,不能作为构造函数,不能使用new,(匿名函数,无法new对象)如下例子:
let Student = () => {
console.log('箭头函数不能作为构造函数');
}
let student = new Student();//会报错
c、箭头函数没有原型属性,如下例子:
var add = (a, b) => a + b;
console.log(add.prototype); // 这里得到的结果是undefined,其中prototype可以为对象添加属性和方法,(在JavaScript中,函数也是对象)。
function print() {
console.log("Tom");
}
console.log(print.prototype);//输出个object
d、箭头函数不绑定arguments,而是使用...接收不定参数,如下例子:(下面代码中不一定非要是param,在这里只是把它看作一个变量)
传统函数中:
function print(param) {
console.log(arguments);
}
print(1,2,3);
箭头函数中:(不能用arguments,使用...接收不定参数)
let print=(...param)=>console.log(param);
print(1,2,3);
e、箭头函数中this永远指向其上下文中的this,默认指向在定义它时所处的对象(宿主对象),而不是执行时的对象,普通函数中this指向调用它的对象,如下代码:
var student = {
age: 10,
a:function(){
console.log(this); //Object { age: 10, a: a(), b: b(), c: c() }
console.log(this.age); //10
}
b: () => {
console.log(this); // Window
console.log(this.age); // undefined
},
c: function() {
return() => {
console.log(this); //Object { age: 10, a: a(), b: b(), c: c() }
console.log(this.age); //10
}
}
}
student.a();
student.b();
student.b();
代码中,//后面是执行后的结果;b()是箭头函数定义它的时候,外部环境是window,所以b()中的this指向window,而不是调用它的对象 ;在c()内部有个箭头函数,指向外部函数的this,在这里a()和c()中this是相同的,即外部环境a()和c()一样,所以得到的结果和a()函数得到的结果一样。
7、箭头函数不能当做Generator函数,不能使用yield关键字;