2013-12-19 79 views
0

JavaScript的步驟,讓我們有一個簡單的腳本片段:創建對象和函數調用

var foo=function(){ return 'a'; };//1 
var bar={prop:foo()};//2 
alert(bar.prop);//3 

foo功能代碼正在執行什麼線?在2還是3?如果可能,請給我一個規範證明/鏈接。

確實如果翻譯發現_some_name()內部方法[[Call]]將被調用?

+1

2了,但是我不知道爲什麼你需要任何證明 - 它很明顯的! – Jamiec

+1

當然是2。通過在名稱後面加上'()'來實現_invoke_函數。 – raina77ow

+0

使用'()'調用函數時會運行一個函數。因此,'foo()'正在第2行運行.'bar.prop'被設置爲一個字符串,而不是一個函數。 –

回答

2

在線路2

1行是FOO被定義在哪裏。第2行是它被調用的地方。

+0

以及OP要求的鏈接:http://www.ecma-international.org/ecma-262/5.1/#sec-11.2.3 –

+0

@ T.J。 Crowder非常感謝,這就是我需要的!但是我還有一個疑問:當解釋器發現令牌「CallExpression:MemberExpression Arguments」時,會執行11.2.3的步驟嗎? –

+1

@ St.Antario:是的,但公平的警告,規範中使用的術語和符號很難閱讀,除非您真的在外部研究符號。特別是,不要覺得有涉及冒號(':')的印象。沒有,現在正在使用的符號定義術語* CallExpression *。 'foo()'是一個調用表達式(注意在任何地方都沒有冒號)。就像你可能會寫「汽車:普通車輛通常有四個車輪和一個封閉的小屋」。 –

4

請看下面的例子

var foo = function() { return 'a<br />'; }; 
 
var bar = { prop: foo() }; // foo is invoked here and 'a' assigned to bar.prop 
 
document.body.innerHTML += bar.prop; 
 

 

 
var baz = { prop: foo }; // foo is assigned to baz.prop 
 
document.body.innerHTML += baz.prop(); // foo is invoked here

相關問題