2014-10-29 69 views
0

下面的代碼工作正常爲什麼在刪除一些代碼行時發生錯誤?

obj = { 
 
    go: function() { alert(this) } 
 
} 
 
obj.go(); // object 
 
(obj.go)(); // object 
 
(a = obj.go)(); // window 
 
(0 || obj.go)(); // window

但爲什麼發生錯誤,當我評論的開頭兩行呢?

obj = { 
 
    go: function() { alert(this) } 
 
} 
 
//obj.go(); // commented this line 
 
//(obj.go)(); // commented this line 
 
(a = obj.go)(); // window 
 
(0 || obj.go)(); // window

我沒有改變任何代碼同上,只是註釋兩行這是從別人分開,然後在瀏覽器給了我錯誤的信息?任何人都可以請澄清,對我?非常感謝。

+0

在我的GC控制檯中工作正常 – 2014-10-29 16:00:53

+0

「爲什麼發生錯誤」 - **什麼**錯誤?! – Quentin 2014-10-29 16:01:45

+0

@Amit Joki,我不小心加了;在函數定義之後,如果我刪除了;它不會再工作... – bean 2014-10-29 16:02:30

回答

1

您在}之後立即有(,因此您試圖將塊評估結果視爲函數。

但是,在您執行此操作之前,您正在嘗試評估a = obj.go以便它可以作爲參數傳遞。

由於obj尚未定義(因爲調用「函數」的結果尚未傳遞給obj),所以會引發錯誤。

3

沒有分號,由於對象不是一個函數,當你嘗試調用它,你得到一個錯誤,你的第二個樣品被解析爲

obj = { ... }(...)(); 

Javascript中的分號是可選的,並且您的第一個示例是無分號的無效語法,因此它隱含地插入了分號。

+1

「由於對象不是函數,所以當您嘗試調用它時會出錯。」 - 那會發生,但是在代碼得到這個之前還有另一個錯誤發生。 – Quentin 2014-10-29 16:05:15

+0

@SLaks,是否意味着我需要添加;對每個表達手動? – bean 2014-10-29 16:07:37

+0

@bean這是一個有點爭議的問題。根據[你是否建議在JavaScript中的每個語句之後使用分號?](http://stackoverflow.com/q/444080/18192),Stackoverflow用戶傾向於說。你可以更進一步,並使用一個linting工具(最流行的是[JSHint](http://www.jshint.com)和[JSLint](http://www.jslint.com))來檢測這種類型的東西。 – Brian 2014-10-29 16:28:38

相關問題