標籤:解釋 返回 運行時 type stat win 相同 top 解譯器
function Foo() { //① 聲明一個Foo的函數 getName = function () { alert (1); }; return this;}Foo.getName = function () { alert (2);}; ② 為Foo建立一個叫getName的靜態屬性儲存一個匿名函數Foo.prototype.getName = function () { alert (3);}; ③為Foo的原型對象建立一個叫getName的匿名函數var getName = function () { alert (4);}; ④通過運算式建立一個getName的函數function getName() { alert (5);} ⑤聲明一個叫getName的函數① Foo.getName(); //2 直接存取Foo函數上儲存的靜態屬性 2② getName(); //4 ③ Foo().getName(); //1 ④ getName(); //1⑤ new Foo.getName(); //2
⑥ new Foo().getName();
⑦ new new Foo().getName();
科普一下靜態屬性和靜態方法;
function Myobject(){ this.instanceProp="456"; // 執行個體屬性instanceProp this.instanceMethod=function(){}; //執行個體方法instanceMethod}Myobject.prototype.protoProp="789";Myobject.prototype.protoMethod=function(){};Myobject.staticProp="123"; //這樣子添加的屬性static就叫做靜態屬性Myobject.staticMethod =function(){ //這樣添加的方法staticMethod就叫做靜態方法};var myobject=new Myobject();
以上屬性和方法都是依賴於對象,JS中都是對象,函數也是對象
為一個函數的原型對象賦值後就會存在,
以這個函數為建構函式建立的執行個體對象能夠訪問到原型的屬性及方法
第一問知識點:
- 調用公有方法,公有屬性,我們必需先執行個體化對象,也就是用new操作符實化對象,就可建構函式執行個體化對象的方法和屬性,並且公有方法是不能調用私人方法和靜態方法的
- 靜態方法和靜態屬性就是我們無需執行個體化就可以調用
- 而對象的私人方法和屬性,外部是不可以訪問的
第二問知識點:
- JavaScript 解譯器中存在一種變數聲明被提升的機制,也就是說函式宣告會被提升到範圍的最前面,即使寫代碼的時候是寫在最後面,也還是會被提升至最前面。
- 而用函數運算式建立的函數是在運行時進行賦值,且要等到運算式賦值完成後才能調用
Javascript中函式宣告和函數運算式是存在區別的,函式宣告在JS解析時進行函數提升,因此在同一個範圍內,不管函式宣告在哪裡定義,該函數都可以進行調用。而函數運算式的值是在JS運行時確定,並且在運算式賦值完成後,該函數才能調用。
第三問知識點:
Foo().getName();先執行了Foo函數,然後調用Foo函數的傳回值對象的getName屬性函數。
執行Foo函數的時候,由於裡面是一句指派陳述式;(沒有var聲明);先向Foo函數範圍裡面尋找getName變數,沒有找到;所以向函數的範圍上層尋找是否有getName變數;其實是第④行運算式聲明的函數;此時再在函數裡面賦值為function(){alert(1);},之後Foo函數返回是this,調用的時候指向他本身。所已此時的答案為1;
知識點 : this指向、函數運算式聲明提前,範圍;
第四問知識點: ps:直接調用 getName函數 相對於window.getName();這個變數已經被Foo函數執行時給修改了;所以與第三問相同;
第五問知識點 :
打點.訪問的優先順序高於new()無參數運算子 參考運算子優先順序https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_Precedence
第六問和第七問都是執行個體化對象,然後調用執行個體化對象的方法;所以得到3
原文連結:https://juejin.im/entry/58db95eaac502e0058f8472e?from=timeline
JavaScript一些重要知識點結合題目的表現!