題目如下:
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()
newnew 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程式...