2013-10-17 57 views
0

爲了擴大對這個問題,我想這種說法是可能的:在評估右側之前,是否有可能強迫`=`的左側完全評估爲參考?

declare("Hello") = bindVal("World") 

其中兩個declarebindVal的功能,做這樣的事情:

function declare(p){ return window[p] } 
function bindVal(x){ return x } 

這裏的關鍵是,declare運行一些手術並且有一些副作用。但在我的情況下,declare不必返回任何東西。儘管如果它返回一個等待分配值的「懸掛」變量,那將是最理想的。

現在運行在控制檯這個表達式引發錯誤:

ReferenceError: Invalid left-hand side in assignment 

所以我的問題是:我可以做任何事情花哨功能declare這樣,我的說法是可能的嗎?在我看來,這是一個如何的左側和右側進行評估的順序:

declare("Hello") = bindVal("world") 
window.Hello  = bindVal("world") 
window.Hello  = world 

綜上所述,左側完全右側前評估。

+3

不可能爲函數調用賦值。 –

+2

我不明白這個問題。爲什麼你不能只寫'window.Hello = world'? – georg

+0

你應該把賦值放在'declare'中,並且傳遞'bindVal(...)'作爲第二個參數。 –

回答

5

an assignmentmust be a referenceyou can't return a reference from a function左邊部分:

No built-in ECMAScript function defined by this specification returns a reference and there is no provision for a user-defined function to return a reference.

所以,你必須以其他方式做到這一點。

你可以返回的名稱要改變的變量,但最乾淨的將是返回一個函數進行分配:

function declare(n){ 
    return function(v){ window[n]=v } 
} 
declare("Hello")(bindVal("World")); 
+0

函數是否可以查找其引用的名稱?所以這個函數'name = function(){return findMyName()}'會返回'name' – chibro2

+0

那麼,它會在'name1 = name2 = function(){return findMyName()}'中做什麼? –

+0

那麼,如果我忽略了這個用例,並且只關注非別名賦值,那麼是否有可能? – chibro2

1

你正在嘗試做聽起來很有趣,但不幸的是用javascript你不能去做。

declare一個函數只能執行操作並返回一些或什麼都沒有。

你不能給函數執行調用分配任何東西,但是你可以嘗試類似JavaScript中的鏈接方法。