考查this指向
1、
let length=100
function f1(){
console.log(this.length)
}
let obj={
length:10,
f2:function(f1){
f1()
arguments[0]()
}
}
obj.f2(f1,1); //100 2
//分析arguments[0]形式
function f1() {
console.log(this)
}
let arr = [f1, 1, 2, 3]
arr[0]() //注意这里,数组调用函数就类似于对象调用函数 像:obj['f1'](),所以this指向该数组
分析:this指向分为以下几种情况
1、默认绑定 无调用者会指向window, 严格模式下指向undefined,node环境指向global;
2、隐式绑定 指向调用者;
3、显示绑定call apply bind(改变this指向);
4、new方式
解析:显然f2函数是被obj对象调用的,所以f2中的this是指向obj的,f1函数作为参数传递到f2函数中被调用,前面并没有调用者,所以f1函数中的this指向window,所以会输出100;arguments是指传入的形参,承接代码中的分析,this应该指向的是arguments数组对象,故this.length就等于arguments.length,所以输出了2;
全局变量和局部变量同名时的坑
1、
var a=10
function test(){
console.log(a)
a=100;
console.log(this.a)
var a;
console.log(a)
}
test() //undefined 10 100
//这里可以进一步改造一下
var a=10
function test(){
console.log(a)
a=100;
console.log(this.a) //注意!!!这里this依然是指向window,但是因为a=100改变的是全局变量,
//this.a指向的也是全局变量a,所以会跟着全局变量发生改变,输出100;
//var a; 去掉这行代码 此时没有了变量提升,函数中的变量a都是使用的全局变量a
console.log(a)
}
test() //10 100 100
涉及知识点:
变量提升和预解析;
作用域;
解析:
函数中有用var声明的变量,所以变量a会被提升到函数作用域中的顶部,由于此时a只是声明并未进行复制操作所以第一行会打印undefined;
a=100此时的a变成了一个局部变量,所以this.a指向的是window下全局变量a,因此打印10;
因为前面局部变量a已经进行了赋值,所以最后打印出100
2、
var a=10;
function f1(){
var b=2*a
var a=20
var c=a+1
console.log(b)
console.log(c)
}
f1() //NaN 21
//执行过程相当于:
var b;
var a;
var c;
b=2*a;
a=20;
c=a+1;
console.log(b);
console.log(c);
//结果是不是一目了然了呢
这里注意一下2*undefined等于NaN
未完待续...