2017-04-11 52 views
0

我是新來的。我有一個困擾着我的問題。我想知道是否有人可以指出我正確的方向。我有以下代碼。從Javascript中的另一個函數訪問本地變量與閉包?

var f1 = function() { 

    var myValue = 3; 

    setTimeout((function(myValue){ 
    return function() { 
     f2(); 
    }; 
    })(myValue), 1000); 

}; 

var f2 = function() { 
    console.log(myValue); 
} 

f1(); 

我得到myValue未定義。我在這裏錯過了什麼?如何在f2中訪問myValue而不將其設爲全局或作爲參數傳遞?提前致謝。

----附加信息----

爲什麼我問到這個問題,因爲我有這個一個面試問題的原因。鑑於以下功能:

var func1 = function() { 
    var myValue = 3; 
    setTimeout(func2, 1000); 
}; 

var func2 = function() { 
    console.log(myValue); 
}; 

func1(); 

不移動的功能或添加參數的功能,只改變裏面有什麼FUNC1。如何在console.log中獲取myValue打印。

+0

將它作爲參數調用'從f2'是不同的'f1' –

+0

如果您可以使用localStorage,請將localStorage中的值設置爲f1,然後從f2中的localStorage中讀取它。 –

+0

閱讀JS中的變量作用域。 – Slime

回答

0

最簡單的方法得到它的控制檯,這是您的要求,是簡單地刪除FUNC1的「變種」打印。這樣可以將myValue推入全局範圍。在現實世界中,你不會認爲這是一個很好的解決方案,但它解決了這個問題。如果你得到這份工作,你欠我一杯啤酒。你應該選擇我的答案。 :)

var func1 = function() { 
    myValue = 3; 
    setTimeout(func2, 1000); 
}; 

var func2 = function() { 
    console.log(myValue); 
}; 

func1(); 


以前的答案如下:

你的函數f2是不是在相同的範圍內myvalue的。您可以F1中定義它像這樣,它會工作:

var f1 = function() { 

    var myValue = 3; 

    var f2 = function() { 
    console.log(myValue); 
    } 

    setTimeout((function(myValue){ 
    return function() { 
     f2(); 
    }; 
    })(myValue), 1000); 
}; 

f1(); 
+0

但是,感謝您的回覆,我無法移動該功能。請檢查我的附加信息。 –

0

這裏有一個辦法做到這一點,根據您的澄清:

var func1 = function() { 
 
    var myValue = 3; 
 
    window.myValue = myValue; /* Push it into the global scope, assuming you're running in a browser */ 
 
          /* If you're running elsewhere (e.g. node.js) there are similar options */ 
 
    setTimeout(func2, 1000); 
 
}; 
 

 
var func2 = function() { 
 
    console.log(myValue); 
 
}; 
 

 
func1();

說明:或者,如果你使用這個(即this.myValue),那麼你可以使用像這樣的機制調用適用只是另一個推入範圍FUNC2,但在你的問題給出推可變myvalue的到全球範圍內的確切的例子是我能想到的最簡單的解決方案。

注:推變量納入全球範圍取決於不管你是在瀏覽器中運行,或者沒有(如Node.js的)

+0

感謝您的回覆,但是我無法移動這些功能。 –

+0

@WilliamNg根據您的澄清更新瞭解決方案並提供瞭解決方案 – Ciabaros

相關問題