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呼叫引數指定thisfunction
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...