目錄
一:顯式繫結 vs 隱式繫結
二:new繫結 vs 隱式繫結
三:顯示繫結 vs new繫結
四:總結
在前面的學習中,有預設繫結、顯式繫結、隱式繫結、new繫結,這4種規則當中,預設繫結的優先順序一定是最低的,那麼其它三個規則的優先順序到底是怎麼樣的呢?
例子:
function foo()
var obj1 =
var obj2 =
obj1.foo(); // 2
obj2.foo(); // 3
obj1.foo.call(obj2); // 3
obj2.foo.call(obj1); // 2
這個例子中,foo如果是單純的隱式繫結到obj1或者是obj2的話,都是可以被繫結到指定的物件中的。但是如果隱式繫結和顯式繫結都同時存在的情況下,從結果來看,是顯式繫結的優先順序比較高的,它覆蓋了隱式繫結的行為。
例子:
function foo(something)
var obj1 =
var obj2 = {}
obj1.foo(2);
console.log(obj1.a); // 2
obj1.foo.call(obj2, 3);
console.log(obj2.a); // 3
var bar = new obj1.foo(4); // this指向bar
console.log(obj1.a); // 2
console.log(bar.a); // 4
這個例子中,由於foo在前面隱式繫結了obj1,執行之後,obj1被建立了乙個a屬性,值為2。後面new乙個obj1.foo(4),這裡this被繫結到了bar這個新建立的物件上了。
所以得出的結論是:new繫結比隱式繫結的優先順序高。
function foo(something)
var obj1 = {};
var bar = foo.bind(obj1); // bar的this繫結到了obj1物件上
bar(2);
console.log(obj1.a); // 2
var baz = new bar(3);
console.log(obj1.a); // 2
console.log(baz.a); // 3
例子中,obj1在前面已經由foo的隱式繫結建立了乙個屬性a,值為2;然後bar的this被指向到了obj1物件上。後面,new bar(3),最後輸出的結果是obj1.a還是2,baz.a是3。說明new繫結比顯示繫結的優先順序還要高。
根據上面的比較可以得出結論,優先順序最高的是new繫結,接著是顯示繫結,然後是隱式繫結,最後是預設繫結。
this四大繫結規則
談到this繫結規則要先找到函式執行過程中的呼叫位置。呼叫位置就是函式在 中被呼叫的位置。這就涉及分析呼叫棧 就是為了到達當前執行位置所呼叫的所有函式 呼叫位置就在當前正在執行的函式的前乙個呼叫中。那什麼是呼叫棧和呼叫位置呢?1.呼叫棧和呼叫位置 function baz function bar ...
2 3 this 繫結規則的優先順序
上篇 2.2this全面解析 了解到函式呼叫中this繫結的四條規則,找到函式的呼叫位置並判斷應當應用哪條規則。這篇學習假設某個呼叫位置可以應用多條規則,就必須給這些規則設定優先順序。毫無疑問,預設繫結的優先順序是四條規則中最低的,所以可以先不考慮它。function foo var obj1 va...
下三角陣列指定規則賦值
本題目為東北師範大學資訊科學與技術學院2019年碩士研究生 技術科目招生試題,由一位高中同學提供,讓我三年沒用c的又重操舊業。題目內容 編寫程式按下面指定的資料為陣列x的下三角元素賦值,並按如下形式輸出 3 7 2 6 9 1 5 8 10 方法一 找規律 俗話說,找到規律最簡單,輕輕鬆鬆乙個通式就...