亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

前端面試題目,求解答

前端面試題目,求解答

慕容森 2018-08-01 17:01:55
function  Foo() {       getName =   function () {        console.log(1);    };       return  this;}Foo.getName =   function () {    console.log(2);};Foo.prototype.getName =   function () {    console.log(3);};var  getName =   function () {    console.log(4);};function  getName() {    console.log(5);}//請寫出以下輸出結果:Foo.getName(); getName(); Foo().getName(); getName();  new  Foo.getName(); new  Foo().getName(); new  new  Foo().getName(); 如題,求大神解答,希望可以把原因寫得很詳細。
查看完整描述

2 回答

?
臨摹微笑

TA貢獻1982條經驗 獲得超2個贊

這樣題目只能作為面試,生產環境沒有這么寫的。

當調用這個 Foo() 的時候,getName 成為全局變量,不使用 var 這樣的在嚴格模式是不允許的,另外在嚴格模式下函數內的this指向undefined的,非嚴格模式下就成了window

function  Foo() {   
    getName =   function () {        
        console.log(1);
    };   
    return  this;
}
var  getName =   function () {    
    console.log(4);
};
function  getName() {    
    console.log(5);
}

這個就相當于

// 函數表達式提升比Function聲明提升少一級
function  getName() {    
    console.log(5);
}
// 這里就會重寫了
var getName;
getName =  function () {    
    console.log(4);
};


查看完整回答
反對 回復 2018-08-05
?
慕沐林林

TA貢獻2016條經驗 獲得超9個贊

JS在執行之前有一個編譯階段,在編譯階段主要:一、初始化用var定義的變量為undefined;二、初始化function定義的函數。注意:兩種定義函數的方式在編譯階段初始化的結果是完全不同的,比如:

var greet = function(){}; // `greet` 初始化為 `undefined`

// 而

function greet(){} // `greet` 初始化為 函數

結合你的例子,實際上根據編譯及執行的過程,可以將代碼的順序調整為:

// 定義 1

function Foo() {

  // 定義 7

  getName = function() {

    console.log(1);

  };

  return this;

}

// 定義 2

var getName = undefined;

// 定義 3

function getName() {

  console.log(5);

}

// 定義 4

Foo.getName = function() {

  console.log(2);

};

// 定義 5

Foo.prototype.getName = function() {

  console.log(3);

};

// 定義 6

getName = function() {

  console.log(4);

};


//請寫出以下輸出結果:

Foo.getName(); // 2 [定義 4]


getName(); // 4 [定義 6]


Foo().getName(); // 1 `Foo()`做了兩件事:

// 一:將`getName`從[定義 6]改變為[定義 7]

// 二:`return this`, `this`此時為`window`

// 所以`Foo().getName()`相當于`window.getName()`相當于`getName()`(注意,此時getName為[定義 7])


getName(); // 1 理由見上


new Foo.getName(); // 2 `new Foo.getName()`相當于`new (Foo.getName)()`, 

// 而不是`(new Foo).getName()`, 這條語句將[定義 4]作為構造函數并執行


new Foo().getName(); // 3 `new Foo().getName()`相當于`(new Foo()).getName()`, 

// 而不是`(new Foo().getName)()`, 這條語句執行了[定義 5]


new new Foo().getName();// 3 `new new Foo().getName()`相當于`new (new Foo().getName)()`, 

// 這條語句將[定義 5]作為構造函數并執行


查看完整回答
反對 回復 2018-08-05
  • 2 回答
  • 0 關注
  • 1189 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號