JS 中 this 機制
- this 是什么
- 調用的方法
this 是什么
理解this之前, 先糾正一個觀點,this 既不指向函數自身,也不指函數的詞法作用域。如果僅通過this的英文解釋,太容易產生誤導了。它實際是在函數被調用時才發生的綁定,也就是說this具體指向什么,取決於你是怎么調用的函數。也就是說誰調用的this,this就指向誰
1.純粹的函數調用
這是函數的最通常用法,屬於全局性調用,因此this
就代表全局對象。請看下面這段代碼,它的運行結果是1。
來看這段代碼:
var a = 2;
function fun() {
} console.log( this.a ); fun();
此時的打印結果是2
因為fun()是直接調用的(獨立函數調用),沒有應用其他的綁定規則,這里進行了默認綁定,將全局對象綁定this上,所以this.a 就解析成了全局變量中的a,即2。此時的this相當於Window
2.作為對象方法的調用
函數還可以作為某個對象的方法調用,這時this
就指這個上級對象。
function test() { console.log(this.x); } var obj = {}; obj.x = 1; obj.m = test; obj.m();
此時打印結果為1;this相當於obj對象
3.作為構造函數調用
所謂構造函數,就是通過這個函數,可以生成一個新對象。這時,this
就指這個新對象。
function test() { this.x = 1; } var obj = new test();
4.call/apply 改變this的指向
function Person(name,age){ this.name = name; this.age = age } var person=new Person("xu",18); var obj = {} Person.call(obj,"liu",20)
通過在控制台打印我們可以看出,this現在指的是obj對象,所以說call可以改變this的指向
call與apply的不同在於傳值時是以數組的方式
Person.apply(obj,["liu",20] )