调用时机

如上图代码,打印出的值为2,并不是1,因为setTimeout延时执行,因此实际实行的事件在给a赋值2之后。
会打印出6个6,原因与下面的代码一起理解。
但是,这样的修改,打印出来的就是0~5
1.let 所声明的变量只在 let 命令所在的代码块内有效,for 循环括号内声明的 变量只在循环内有效,因此循环外部不能访问
2.for 循环中如果用 initialize 部分使用 let 初始化,那么这个 for 循环中,设置循环变量的部分(for 后边的()内)是一个父作用域,循环体(for 后边 {}内)内部是一个子作用域。下面的代码中,循环体中,使用let声明a变量,console.log(a)语句会报错,但是使用var则会顺利运行,证明了()是父级作用域。
for (let i = 0; i < 10; console.log(a), i++) {// let a = 1;var a = 1;}
3.每次循环 javascript 都会为循环体创建独立的执行上下文,也就是说一共有6个执行环境, 每个独立环境的i都不同,而var声明的i是全局的,所以每次修改的都是一个i,而函数执行的时候是在自己的环境中,因此每次打印的值都不一样。在外部使用let声明i也是一样,修改的也是全局的i,所以会打出6个6。
this
用来获取未知对象(还没创建)的引用。
function fn() {// "use strict" 下面两个调用为undefined和数值1console.log(this);}fn();//windowfn.call(1);//Number {1} 数值对象 1
1.在函数中使用this,如果在全局环境中定义的函数,那么this指向的就是undefined,因此会自动变成指向window,如果用fn.call()方法来绑定this的指向,那么就不会指向window。但是,call方法会将传入的内容包装成对象。
2.使用use strict来设定使用严格模式,在严格模式下,this就会指向undefined,而不会变成window,而且传入的内容也不会被包装成对象
3.传入多个参数时,例如fn.call(1,2,3),this指向的是1,而arguments伪数组(有下标、值和length,没有数组的方法)则为剩下的参数[2,3]
函数的实例调用
1.obj.fn()会自动将obj传入this
2.obj.fn.call(obj2,x,y…)会将obj2传入this
3.obj.fn.apply(obj2,[x,y,z…])与call用法一样,只是传入参数要用数组形式
使用bind绑定this和参数
function fn1(x, y) {return this.age + x + y;}let obj = { age: 17 };let fn2 = fn1.bind(obj, 1);console.log(fn2(2)); //3
如上fn1.bind(obj,1)会将fn函数的this绑定到obj上,并将函数的x绑定成1,这样调用的时候只需要传入一个y参数就可以了。
箭头函数的this
let fn = ()=>{console.log(this)};
箭头函数的this就是外面的this,换一种说法箭头函数没有自己的this,同样arguments也没有。
