記一道經典前端題

2021-09-11 14:12:30 字數 3029 閱讀 5005

題目如下:

function

foo()

return

this

}foo.getname = function()

foo.prototype.getname = function()

var getname = function ()

function

getname()

// 輸出值 foo.getname(); getname(); foo().getname(); getname(); new foo.getname() new foo().getname() new

new foo().getname()

複製**// 輸出結果為

// 2

// 4

// 1

// 1

// 2

// 3

// 3

複製**

複製**

下面對輸出值進行分析:

foo.getname()輸出為 2, 訪問的是函式 foo 上的靜態屬性,輸出為 2。

現在,嘗試在函式內定義 getname 函式和在 foo 原型上繫結 getname 函式, 都無法成功執行foo.getname(), 而以字面量建立物件的方式建立物件後,則能正常的執行getname()函式。

通過建立物件執行getname()定義在函式內部無法正常執行,即使它是全域性變數。

結論: 由於函式本身是物件,通過函式繫結屬性和方法屬於靜態方法,可以直接呼叫。繫結在原型上的屬性和方法要建立物件後才能呼叫,在建構函式物件內部定義的方法無法通過物件呼叫。

getname();結果輸出為 4,而不是輸出 5。這是因為js 存在變數宣告提公升(所有宣告的變數或宣告的函式都會被提公升到當前函式的頂部)。

故**執行順序為:

var getname;

function

getname()

// ... 省略**

getname = function ()

複製**

複製**

最終執行getname輸出為 4

延伸題目:

console.log( foo )

function

foo()

var foo = 1

複製**

複製**

foo 的輸出結果為?

foo().getname();輸出值為1, 先執行 foo() 函式,定義全域性變數 getname, 之後呼叫全域性物件的getname()方法, 返回 1。

注意,foo()函式返回的this指向的是全域性物件 window,所以呼叫的是全域性物件getname()。 函式裡的 getname 繫結的是全域性物件,通過 foo 呼叫會報錯。

node 下執行這條語句會報錯,因為 node 沒有全域性物件 window, 所以無法呼叫 getname

getname()呼叫全域性函式, 因為執行foo(), 更新了 getname 的值,所以返回 1。

new foo.getname()考察了運算子的優先順序。.的優先順序高於 new, 相當於執行new (foo.getname)(), 相當於執行 getname 的建構函式,返回 2

new foo().getname()執行方式為(new foo()).getname()先生成 foo 物件, 再執行getname()函式。 在new foo()返回的是新建立的空物件,由於物件這時還沒繫結屬性 getname, 所以這時呼叫的是原型上的 getname, 結果返回3

注意: 建構函式return this,在執行 new 的時候,返回的是新建立的物件。

延伸題目:

function

a()

return b();

}console.log(new a());

複製**

複製**

a的值是? 如果return new b();a的值是?

new new foo().getname()可以改寫為new ((new foo()).getname)()先初始化例項,然後將原型物件上的 getname() 作為建構函式執行,結果返回 3

最終**可以優化為

var getname;

function

getname()

function

foo()

return

this

}foo.getname = function()

foo.prototype.getname = function()

getname = function ()

複製**

foo.getname(); // 2 getname(); // 4 foo(); getname(); // 1 getname(); // 1 foo.getname(); // 2 (new foo()).getname(); // 3 (new foo()).getname(); // 3

複製**

複製**

記一道經典前端題

題目如下 function foo return this foo.getname function foo.prototype.getname function var getname function function getname 輸出值 foo.getname getname foo ge...

SQL使用者許可權的一道經典題

資料庫管理綜合練習 條件 資料庫 microsoft 表 table1 table2 表結構自定,表中要求有資料 使用者 a1,a2,b1,b2,c1,c2,d1,d2 要求 1.使用者a1,a2只能檢視表table1 2.使用者b1,b2只能檢視表table2 3.使用者c1,c2可以檢視表tab...

一道經典面試邏輯題的python解法

前言 好早之前看到的乙個邏輯題 有兩個2到99之間的整數,a知道這兩個數的和,b知道這兩個數的積。第一句 a對b說 我不知道這兩個數是多少,但我確信你也不知道。第二句 b說 我知道了。第三句 a說 我也知道了。問這兩個數是多少?題不難,只是手動去找沒有python寫程式找的快,而且用python程式...