-
块作用域 : { }
JS中作用域有:全局作用域、函数作用域。没有块作用域的概念。ECMAScript 6(简称ES6)中新增了块级作用域。块作用域由 { } 包括,if语句和for语句里面的{ }也属于块作用域。const与let都具有块级作用域。 -
常量 const
由于var和let申明的是变量,如果要申明一个常量,在ES6之前是不行的,我们通常用全部大写的变量来表示“这是一个常量,不要修改它的值”:var PI = 3.14;
ES6标准引入了新的关键字const来定义常量。 -
var、let、const的区别
- var定义的变量,没有块的概念,可以跨块访问, 不能跨函数访问。
- let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问。
- const用来定义常量,使用时必须初始化(即必须赋值),只能在块作用域里访问,而且不能修改。
- 变量提升
JavaScript的函数定义有个特点,它会先扫描整个函数体的语句,把所有申明的变量“提升”到函数顶部。JavaScript引擎自动提升了变量的声明,但不会提升变量的赋值。
function foo() {
var x = 'Hello, ' + y;
console.log(x);
var y = 'Bob';
}
foo(); // Hello, undefined
6.解构赋值
ES6中,可以使用解构赋值,直接对多个变量同时赋值。嵌套层次和位置要保持一致
let [x, [y, z]] = ['hello', ['JavaScript', 'ES6']];
还可以忽略某些元素
let [, , z] = ['hello', 'JavaScript', 'ES6']; // 忽略前两个元素,只对z赋值第三个元素
对象中取出若干属性,也可以使用解构赋值
var person = { name: '小明', age: 20}; var {name, age} = person;
嵌套的对象属性进行赋值,只要保证对应的层次是一致的
var person = { name: '小明', address: { city: 'Beijing',zipcode: '100001' }};
var {name, address: {city, zip}} = person;
name; // '小明'
city; // 'Beijing'
zip; // undefined, 因为属性名是zipcode而不是zip
// 注意: address不再是变量,而是为了让city和zip获得嵌套的address对象的属性:
address; // Uncaught ReferenceError: address is not defined
解构赋值还可以使用默认值,这样就避免了不存在的属性返回undefined的问题:
var {name, single=true} = person;
变量已经被声明, 解构赋值用小括号括起来(把{
开头的语句当作块处理,于是=
不合法)
var x, y; ({x, y} = { name: '小明', x: 100, y: 200});
对应的属性不存在,变量将被赋值为undefined,这和引用一个不存在的属性获得undefined是一致的。如果要使用的变量名和属性名不一致,可以用下面的语法获取:
var person = {
name: '小明',
passport: 'G-12345678',
};
// 把passport属性赋值给变量id:
let {name, passport:id} = person;
id; // 'G-12345678'
// 注意: passport不是变量,而是为了让变量id获得passport属性
passport; // Uncaught ReferenceError: passport is not defined
使用场景
交换两个变量x和y的值,不再需要临时变量:
var x=1, y=2; [x, y] = [y, x]
快速获取当前页面的域名和路径:
var {hostname:domain, pathname:path} = location;
函数接收对象作为参数,可使用解构直接把对象的属性绑定到变量中。
function buildDate({year, month, day, hour=0, minute=0, second=0}) {
return new Date(year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + second);
}
它的方便之处在于传入的对象只需要year、month和day这三个属性:
buildDate({ year: 2017, month: 1, day: 1 }); // Sun Jan 01 2017 00:00:00 GMT+0800 (CST)
也可以传入hour、minute和second属性:
buildDate({ year: 2017, month: 1, day: 1, hour: 20, minute: 15 }); // Sun Jan 01 2017 20:15:00 GMT+0800 (CST)
7.方法
绑定到对象上的函数称为方法,和普通函数没啥区别,但在方法内部可以使用this
关键字,this是特殊变量,它始终指向当前对象。this.XXX可以拿到当前对象属性。
要保证this指向正确,必须用obj.xxx()的形式调用!
方法内部定义其他函数,函数内this又指向undefined,修复的办法:用that变量首先捕获this
控制this的指向:
getAge.apply(需要绑定的this变量, [函数本身的参数]);
call(需要绑定的this变量, 函数本身的参数);
参数使用不同,比如调用Math.max(3, 5, 2),分别用apply()和call()实现如下:
Math.max.apply(null, [3, 5, 2]); // 5
Math.max.call(null, 3, 5, 2); // 5
重绘(repaint): 当元素样式的改变不影响布局时,浏览器将使用重绘对元素进行更新,此时由于只需要UI层面的重新像素绘制,因此 损耗较少
回流(reflow): 当元素的尺寸、结构或触发某些属性时,浏览器会重新渲染页面,称为回流。此时,浏览器需要重新经过计算,计算后还需要重新页面布局,因此是较重的操作
https://www.liaoxuefeng.com/wiki/1022910821149312/1023023754768768
网友评论