this學習(三)this繫結規則的優先順序

2021-09-24 22:23:02 字數 1430 閱讀 9882

目錄

一:顯式繫結 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 方法一 找規律 俗話說,找到規律最簡單,輕輕鬆鬆乙個通式就...