今天有人在群裡問settimeout第一次引數為字串的時候為什麼會報錯,**如下:
functiondisplay(obj)
報obj is not defined。
經過我自己測試了列子,自己總結出了幾個結論,真實性有待考證。下面講講我的例子與結論。
首先,settimeout的第乙個引數分為3類,1.字串** 2.method 3.function 。
1.字串**:
functiondisplay(obj)
當settimeout第乙個引數為字串**時,執行這段**會報obj未定義,原因是因為settimeout方法是window的方法,是個全域性方法。執行這個方法的**的作用域環境是window。
obj是當初display方法的引數傳進來的,是個區域性變數。在window下找不到obj這個變數所以報未定義。
2.method:
在這兒我把method和function區分開了,區別在哪兒呢?**如下:
functiondisplay(obj)
function
fn(o)
像上面**一樣執行,還是會報obj未定義,原因和上面一樣的,這兒呼叫的fn()是全域性方法,它的引數obj在全域性變數中找不到。
這個和引數為function的區別在於,method是定義好了方法,當成第乙個引數傳過settimeout(),而function是在第乙個引數的位置定義function,兩者有很大的區別,下面會講解。
functiondisplay(obj)
function fn(0)
我把fn(obj)的引號去掉了,這樣的寫法是錯誤的,這樣寫,fn會被立即呼叫,而不是500毫秒之後。
3.function:
functiondisplay(obj)
,500);
}
這種寫法是把function直接寫在了settimeout的第乙個引數位置,這樣寫就和display()形成了乙個閉包。所以settimeout執行function的時候display的作用域是存在的。
這樣就會先去display()的作用域找obj這個變數,obj是當方法的引數傳進來的,所以是能找到的。這樣就能正確的執行這段**。
總結:
要解決這種問題又兩個方法,第一:把obj宣告成全域性變數,settimeout是可以呼叫的。全域性變數會一直存在,直到頁面關閉。
第二種:把settimeout方法的第乙個引數寫成function,這樣形成乙個閉包來訪問區域性變數。但是閉包會使得它的父函式的變數和方法一直處於記憶體,直到閉包函式呼叫結束。
此兩種方法各有優缺點,根據自己的需求來取捨。
setTimeout的第乙個引數出錯問題
今天有人在群裡問settimeout第一次引數為字串的時候為什麼會報錯,如下 function display obj 報obj is not defined。經過我自己測試了列子,自己總結出了幾個結論,真實性有待考證。下面講講我的例子與結論。首先,settimeout的第乙個引數分為3類,1.字串...
python第乙個程式設計 第乙個 Python 程式
簡述 安裝完 python 後,windows 中 開始選單或安裝目錄下就會有 idle 開發 python 程式的基本 ide 整合開發環境 幫助手冊 模組文件等。linux 中 只需要在命令列中輸入 python 命令即可啟動互動式程式設計。互動式程式設計 互動式程式設計不需要建立指令碼檔案,是...
CreateFile第乙個引數裝置名稱
首次利用api函式createfile獲得裝置控制代碼時,應該會對第乙個引數 lpfilename的值比較困惑。handle createfile lpctstr lpfilename,檔名 裝置路徑 裝置的名稱 dword dwdesiredaccess,訪問方式 dword dwsharemod...