JS中this指向的問題

2021-09-03 01:24:45 字數 1798 閱讀 2979

this是js中的乙個關鍵字,它是在函式執行時,自動生成的乙個內部物件,根據不同的函式使用場合或者說是在不同的函式**塊中,它的值是不同的

一、普通函式:

1、this在全域性環境中,無論是否是嚴格模式,this就代表全域性物件window。

'use strict'

console.log(this === window); // true

2、在非箭頭函式下, this 指向呼叫其所在函式的物件,由誰呼叫指向誰

作為普通函式呼叫,這時函式屬於全域性性呼叫,因此this就代表全域性物件window。

作為物件方法的呼叫,這時this就指這個當前物件。

test();

function test()

注:如果函式作用域中使用嚴格模式,this不會指向window

test();

function test()

3、在建構函式中,this指向新的例項物件

4、自執行函式、定時器中,this預設指向window

var obj = );  

} }

obj.say();

二、箭頭函式

箭頭函式的this是繼承而來; 預設指向在定義時所處的物件。在定義的時候就決定了指向。

(ps:函式內層的this就是外層**塊的this)

// 箭頭函式中的this指向上一層的**塊的this

function foo() , 100);

}var obj =

var id = 21;

foo(); //由window呼叫, 21

obj.foo(); //由obj呼叫 1

在箭頭函式中,this的指向是固定的。

下面這個這個例子來自阮一峰的《ecmascript6入門》:

function timer() , 1000);

}var timer = new timer();

settimeout(() => console.log('s1: ', timer.s1), 3100);

settimeout(() => console.log('s2: ', timer.s2), 3100);

// s1: 3

// s2: 0

time函式內部設定了兩個定時器,分別使用了箭頭函式和普通函式。前者的this繫結定義時所在的作用域(即timer函式),後者的this指向執行時所在的作用域(即全域性物件)。所以,3100 毫秒之後,timer.s1被更新了 3 次,而timer.s2一次都沒更新。

有個比較容易誤解的地方,如下:

var obj = ,

fn1:()=>,

fn2:function()

a();}}}

obj.m.fn(); //obj

obj.m.fn1(); //window

obj.m.fn2(); //obj

obj.m.fn1()對應輸出是window的,我的理解是作用域分為全域性和函式作用域,fn1不在函式作用域中,是在全域性中(ps:如果這麼理解不準確,或者有更好的解釋麻煩我說下哦^_^)。

第乙個引數都是this要指向的新的物件,也就是想指定的上下文;

第二個引數開始,就是函式的本身的引數;

區別:bind 是返回對應函式,返回新函式,便於稍後呼叫,不會馬上呼叫;

JS中this指向問題

解析器在呼叫函式時,每次都會向函式內部傳遞進乙個隱含的引數,這個隱含的引數就是this,this指向的是乙個物件,這個物件我們稱之為函式執行的上下文物件,根據函式的呼叫方式不同,this會指向不同的物件.簡單來說一下函式中this指向問題,1.this是什麼?任何函式本質上都是通過某個物件來呼叫的,...

JS中this指向問題

函式內部的this之和函式的呼叫方式有關,和函式的定義方式沒有關係functionfn fn windowvar obj obj.fn obj functionfn 或者可以這樣寫自呼叫函式 functionfn div document.queryselector div div.onclick ...

JS中this指向問題

與其它語言相比,js的this關鍵字的指向稍微有點差別。一 全域性環境 首選我們要明確一點,在全域性環境中 在任意函式體外部 無論是嚴格模式還是非嚴格模式,this都指向window。下面,我們來通過幾個例子理解一下。示例1 console.log this 這裡的this在全域性域下,指向wind...