2017-07-08 80 views
0

的代碼如下給出的給定的代碼的輸出:請解釋

function a() { 
    function makeWorker() { 
     this.ename = "Pete"; 
     return function() { 
      console.log(this); 
      console.log(this.ename); 
     }; 
    } 


    var work = makeWorker(); 
    work(); 
} 
var ename = "John"; 
a(); 

this.name輸出到「皮特」。但我已經定義在全局scope.So另一個變量的ename爲什麼是「皮特「打印而不是」John「?程序運行在非嚴格模式下。

+0

@MiHawk:這裏的升降機在哪裏起作用? – Ryan

回答

-2

在JavaScript中有幾個不同的作用域。變量名是在函數的範圍內創建的。要訪問全局範圍變量,你必須以不同的方式調用它們。

https://www.w3schools.com/js/js_scope.asp

+0

要在全局作用域訪問變量,在本地函數作用域創建變量時,必須使用窗口調用它{variableName},在您的案例中window.ename –

+0

您絕不應該向您自己發表評論回答以添加詳細信息。你總是(無論名譽)有能力編輯自己的問題或答案。請這樣做。 –

+0

這個答案只是錯誤的。這裏沒有任何函數範圍的'ename'變量。 – melpomene

2

makeWorker是一種多餘這裏如果a()被稱爲無this無論如何,讓我們用它做什麼代替調用makeWorker

function a() { 
    this.ename = "Pete"; 
    var work = function() { 
     console.log(this); 
     console.log(this.ename); 
    }; 
    work(); 
} 

var ename = "John"; 
a(); 

,代之以調用work它做什麼:

function a() { 
    this.ename = "Pete"; 
    console.log(this); 
    console.log(this.ename); 
} 

var ename = "John"; 
a(); 

and replac E中的呼叫a用它做什麼,再假設this是全局對象:

var ename = "John"; 
this.ename = "Pete"; 
console.log(this); 
console.log(this.ename); 

所以您將全局ename"John",然後將其設置爲"Pete",然後打印出來,其結果是"Pete"。沒有什麼奇怪的。它可以幫助你時,每項任務在原來的代碼恰好記錄了一句:

function a() { 
 
    function makeWorker() { 
 
     console.log("Setting ename to Pete"); 
 
     this.ename = "Pete"; 
 
     return function() { 
 
      console.log(this.ename); 
 
     }; 
 
    } 
 

 
    var work = makeWorker(); 
 
    work(); 
 
} 
 

 
console.log("Setting ename to John"); 
 
var ename = "John"; 
 
a();

+0

很好的解釋 –

-1

它看起來像您正在執行的makeWorker,這是簡單的重寫變量的ename,和你想要訪問全局變量。

看看這篇文章。 How to access global variable in function hook in javascript?

+0

如果您的答案中的所有相關詳細信息都在另一個SO帖子的鏈接中提供,那麼應該關閉該問題作爲該帖子的副本。你應該這樣標記它。 –

+0

嘿肯,謝謝你的擡頭! – TheRock