C語言不宣告函式造成的錯誤(swust oj 排序查詢)
技術標籤:jsjavascript面試
初學js的是時候,覺得js中this的指向是千變萬化的,無所定型,彷彿是時刻在變,至少在一個js檔案裡面不同地方呼叫this都是不盡相同的,面時中時長會有這樣的提問或者面試提出現,今天一次性搞定,應付面試應該夠了;
js中this的指向大致分為以下幾大類:
全域性上下文
非嚴格模式和嚴格模式中this都是指向頂層window物件;
函式上下文
普通函式
普通函式裡面的this一般他的呼叫者;
function test(){
console.log(this.a);// undefined
};
// 相當於window.test()
test();
但是有一點需要說明的時,當我們使用es6的let,const的賦值函式的時候,應為存在區域性作用域的鎖定,但他們定義變數的時候並沒有給頂層物件賦值,所以表現不一致;
物件中的函式this
在探討之前我們先下結論:
1.this永遠指向的是最後呼叫它的物件,也就是看它執行的時候是誰呼叫的;
劃重點:最近的呼叫者,這裡需要注意的是,當我們把物件中的方法賦值給一個變數時,那麼根據最近原則他的this指向的是這個變數所在的環境;
// 普通物件的呼叫
let obj = {
a:"張山",
test:function(){
console.log( this.a);
},
c:{
a:'李四',
test:function(){
console.log(this.a);
},
}
}
obj.test();//張三
obj.c.test();// 李四
let fn = obj.c.test();
fn(); // undefined
call、apply、bind中的this指向
這裡就不做多說了,我的上一篇文章已經詳細說了,這三個的呼叫本身就是改變this的指向的,指向的就是他們的第一個引數或者js最頂層物件;
建構函式呼叫this指向
建構函式中的this,我們都知道指向的時例項本身;
function CreateUser(name){
this.name = name;
console.log(this);
}
var result = new CreateUser('張三');// {name: '張三'}
但是我們需要注意的時,建構函式預設時有一個return操作,預設返回this,當我們的構造內涵顯式的有返回的值的話,它遵循的規則時:
當返回物件的時候,這當前this指向的是這個物件,否則仍然指向的是他的例項;
另外如果返回null,null雖然也是物件,null比較另類,原因我也不知,但要也做一般處理;
// 返回物件
function CreateUser(name){
this.name = name;
return {};
}
const obj = new CreateUser('李四');
obj.name; // undefined;
// 返回非物件或者null,仍指向例項
function CreateUser(name){
this.name = name;
return 1;
}
const obj = new CreateUser('李四');
obj.name; // 李四;
原型鏈中this的指向
這裡純屬概念的東西,原型鏈說白了就是物件的繼承,原型鏈上的方法都是掛載例項上的,所以他的this指向也是指向例項的,沒啥好說的,關於原型和原型鏈的相關概念後續文章中我會專門講到;
箭頭函式的this指向
理論上箭頭函式是不存在this的,因為箭頭函式在this的指向只在他的執行期間通過作用域來向上尋找,直到第一次碰到他的執行環境是,就是他的this指向;作用域鏈的概念大家應該熟悉吧,每個非箭頭函式都有自己的作用域,