JavaScript中this指向問題

2021-08-20 06:59:58 字數 2328 閱讀 9070

this是在執行時繫結的。函式呼叫方式的不同就可能使this所繫結的物件不同

ⅰ.預設繫結

function

foo()

var a = 2;

foo(); //2

//foo()在呼叫時使用不帶任何修飾的函式引用,只能使用預設繫結

ⅱ.隱式繫結
function

foo()

var obj = ;

var a = "opps,global"; //全域性物件的屬性

obj.foo(); //2 隱式繫結

var bar = obj.foo; //這裡進行了一次引用賦值

bar(); //opps,global

如果細心的話你會發現,上邊的**出現了乙個問題:隱式丟失

由於第7行處進行了以此引用賦值,所以造成了bar()不具有上下文物件,故系統會自動採取預設繫結規則

我們再來舉乙個傳參操作造成隱式丟失的例子

function

foo()

function

dofoo

(fn)

var obj = ;

var a = "opps,global";

dofoo(obj.foo); //看似為隱式繫結,但輸出的是opps,global

所以我們需要記住:函式傳遞就是一種隱式賦值,而隱式賦值會造成隱式丟失

同樣,js中的一些內建函式在接受乙個函式作為引數時恩惠發生以上情況

function

settimeout

(fn, delay)

ⅲ.顯式繫結

function

foo()

var obj = ;

foo.call(obj); //2

此種方法仍然無法解決繫結丟失問題

1.硬繫結

function

foo()

var obj = ;

var bar = function

();bar(); //2

settimeout(bar, 1000); //時隔一秒列印2

bar.call(window); //2

通過此方法(包裹函式)可以確保obj的繫結,不過韓式不能為函式傳參

function

foo(something)

function

bind

(fn, obj);

}var obj = ;

var bar = bind(foo, obj);

var b = bar(3);

console.log(b);

//2 3

//5

function

foo(something)

function

bind

(fn, obj);

}var obj = ;

var bar = foo.bind(obj); //bind返回乙個繫結到obj上的新函式

var b = bar(3);

console.log(b);

var a = "window's a";

foo("!"); //對原來的函式不產生影響

//2 3

//15 5

//window's a !

//"window's a!"

6.api呼叫引數指定this
function

foo(e1)

var obj = ;

[1,2,3].foreach(foo, obj); //foreach第二個引數用來設定this

//1 "sir"

//2 "sir"

//3 "sir"

function

foo()

var instance = new foo();

console.log(instance.a);

發生函式的構造呼叫時自動執行以下操作
function foo()

}var obj1 = ;

var obj2 = ;

2

JavaScript中prototype的理解

prototype使我們能夠向物件新增屬性或者方法。語法 object.prototype.name value 2.基於原型的繼承 obj2 和obj3都是函式foo的例項,可以看到每個例項不僅有自己自身的屬性,還具有原型鏈上的x 也就是foo.prototype 3.prototype與原型 通...

javascript中處理時間

var mydate new date mydate.getyear 獲取當前年份 2007 mydate.getfullyear 獲取完整的年份 2007 mydate.getmonth 獲取當前月份 0 11,0代表1月 11 mydate.getdate 獲取當前日 1 31 20 mydat...

javascript中處理時間

var mydate new date mydate.getyear 獲取當前年份 2007 mydate.getfullyear 獲取完整的年份 2007 mydate.getmonth 獲取當前月份 0 11,0代表1月 11 mydate.getdate 獲取當前日 1 31 20 mydat...