今天有人在群裡問settimeout第一次引數為字串的時候為什麼會報錯,**如下:
function報obj is not defined。display(obj)
經過我自己測試了列子,自己總結出了幾個結論,真實性有待考證。下面講講我的例子與結論。
首先,settimeout的第乙個引數分為3類,1.字串** 2.method 3.function 。
1.字串**:
function當settimeout第乙個引數為字串**時,執行這段**會報obj未定義,原因是因為settimeout方法是window的方法,是個全域性方法。執行這個方法的**的作用域環境是window。display(obj)
obj是當初display方法的引數傳進來的,是個區域性變數。在window下找不到obj這個變數所以報未定義。
2.method:
在這兒我把method和function區分開了,區別在哪兒呢?**如下:
function像上面**一樣執行,還是會報obj未定義,原因和上面一樣的,這兒呼叫的fn()是全域性方法,它的引數obj在全域性變數中找不到。display(obj)
function
fn(o)
這個和引數為function的區別在於,method是定義好了方法,當成第乙個引數傳過settimeout(),而function是在第乙個引數的位置定義function,兩者有很大的區別,下面會講解。
注意,這兒提醒下,我在寫**的時候犯了個錯誤,**如下:
function我把fn(obj)的引號去掉了,這樣的寫法是錯誤的,這樣寫,fn會被立即呼叫,而不是500毫秒之後。display(obj)
function fn(0)
3.function:
function這種寫法是把function直接寫在了settimeout的第乙個引數位置,這樣寫就和display()形成了乙個閉包。所以settimeout執行function的時候display的作用域是存在的。display(obj)
,500);
}
這樣就會先去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 命令即可啟動互動式程式設計。互動式程式設計 互動式程式設計不需要建立指令碼檔案,是...
第乙個部落格
我不知道為什麼 我在csdn上創了乙個賬號,又開通了部落格。也許我不是名人,也許幻想著成為名人。在這裡 我不會給任何人許諾,這個部落格可能有乙個博文 有兩個博文 或者會有很多 很多 很多。不過讓我有個大膽的猜想,如果這個部落格在今後有很多很多自己寫的博文,說明我成功了 在自己眼裡 也說明這個方法時正...