考查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]() //注意這里陋率,數(shù)組調(diào)用函數(shù)就類似于對象調(diào)用函數(shù) 像:obj['f1']()球化,所以this指向該數(shù)組
分析:this指向分為以下幾種情況
1、默認綁定 無調(diào)用者會指向window瓦糟, 嚴格模式下指向undefined筒愚,node環(huán)境指向global;
2菩浙、隱式綁定 指向調(diào)用者巢掺;
3、顯示綁定call apply bind(改變this指向)劲蜻;
4址遇、new方式
解析:顯然f2函數(shù)是被obj對象調(diào)用的,所以f2中的this是指向obj的斋竞,f1函數(shù)作為參數(shù)傳遞到f2函數(shù)中被調(diào)用倔约,前面并沒有調(diào)用者,所以f1函數(shù)中的this指向window坝初,所以會輸出100浸剩;arguments是指傳入的形參,承接代碼中的分析鳄袍,this應(yīng)該指向的是arguments數(shù)組對象绢要,故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) //注意V刈铩!!這里this依然是指向window剿配,但是因為a=100改變的是全局變量搅幅,
//this.a指向的也是全局變量a,所以會跟著全局變量發(fā)生改變呼胚,輸出100茄唐;
//var a; 去掉這行代碼 此時沒有了變量提升,函數(shù)中的變量a都是使用的全局變量a
console.log(a)
}
test() //10 100 100
涉及知識點:
變量提升和預(yù)解析蝇更;
作用域沪编;
解析:
函數(shù)中有用var聲明的變量,所以變量a會被提升到函數(shù)作用域中的頂部年扩,由于此時a只是聲明并未進行復(fù)制操作所以第一行會打印undefined蚁廓;
a=100此時的a變成了一個局部變量,所以this.a指向的是window下全局變量a厨幻,因此打印10相嵌;
因為前面局部變量a已經(jīng)進行了賦值,所以最后打印出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
//執(zhí)行過程相當于:
var b;
var a;
var c;
b=2*a;
a=20;
c=a+1;
console.log(b);
console.log(c);
//結(jié)果是不是一目了然了呢
這里注意一下2*undefined等于NaN
未完待續(xù)...