1.let和var在for循环等语句块中作用域的区别
(var)
由于JavaScript的变量作用域实际上是函数内部,我们在for循环等语句块中是无法定义具有局部作用域的变量的:
'use strict';
functionfoo(){
for(vari=0; i<100; i++) {//}
i +=100;// 仍然可以引用变量i}
(let)
用let替代var可以申明一个块级作用域的变量:
'use strict';
functionfoo()
{varsum =0;
for(leti=0; i<100; i++) { sum += i; }// SyntaxError:
i +=1;}
(const)
ES6标准引入了新的关键字const来定义常量,const与let都具有块级作用域:
'use strict';
constPI =3.14;
PI =3;// 某些浏览器不报错,但是无效果!
PI;// 3.14
2.方法中this的使用
2.1 标准用法,this直接调用
var xiaoming = {
name:'小明',
birth:1990,
age:function(){
var y =newDate().getFullYear();
return y -this.birth; }};
xiaoming.age ; // function xiaoming.age()
xiaoming.age(); // 今年调用是25,明年调用就变成26了
绑定到对象上的函数称为方法,和普通函数也没啥区别,但是它在内部使用了一个this关键字,这个东东是什么?
在一个方法内部,this是一个特殊变量,它始终指向当前对象,也就是xiaoming这个变量。所以,this.birth可以拿到xiaoming的birth属性。
2.2 apply进行变量和方法绑定
虽然在一个独立的函数调用中,根据是否是strict模式,this指向undefined或window,不过,我们还是可以控制this的指向的!
要指定函数的this指向哪个对象,可以用函数本身的apply方法,它接收两个参数,第一个参数就是需要绑定的this变量,第二个参数是Array,表示函数本身的参数。
用apply修复getAge()调用:
function getAge( ) {
var y =newDate().getFullYear();
return y -this.birth;} //最后一行代码将this绑定到xiaoming变量
var xiaoming = {
name:'小明',
birth:1990,
age: getAge};
xiaoming.age();// 25
getAge.apply(xiaoming, []); // 25, this指向xiaoming, 参数为空
2.3 引入一个that参数
'use strict';
var xiaoming = {
name:'小明',
birth:1990,
age:function(){
var that =this;// 在方法内部一开始就捕获this
function getAgeFromBirth(){
var y =newDate().getFullYear();
return y - that.birth;// 用that而不是this}
return getAgeFromBirth(); }};
xiaoming.age();// 25
网友评论