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...