1. 程式人生 > 其它 >C語言不宣告函式造成的錯誤(swust oj 排序查詢)

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指向;作用域鏈的概念大家應該熟悉吧,每個非箭頭函式都有自己的作用域,