setTimeout 第乙個引數

2022-02-08 21:35:49 字數 1475 閱讀 9373

今天有人在群裡問settimeout第一次引數為字串的時候為什麼會報錯,**如下:

function

display(obj)

報obj is not defined。

經過我自己測試了列子,自己總結出了幾個結論,真實性有待考證。下面講講我的例子與結論。

首先,settimeout的第乙個引數分為3類,1.字串** 2.method 3.function 。

1.字串**:

function

display(obj)

當settimeout第乙個引數為字串**時,執行這段**會報obj未定義,原因是因為settimeout方法是window的方法,是個全域性方法。執行這個方法的**的作用域環境是window。

obj是當初display方法的引數傳進來的,是個區域性變數。在window下找不到obj這個變數所以報未定義。

2.method:

在這兒我把method和function區分開了,區別在哪兒呢?**如下:

function

display(obj)

function

fn(o)

像上面**一樣執行,還是會報obj未定義,原因和上面一樣的,這兒呼叫的fn()是全域性方法,它的引數obj在全域性變數中找不到。

這個和引數為function的區別在於,method是定義好了方法,當成第乙個引數傳過settimeout(),而function是在第乙個引數的位置定義function,兩者有很大的區別,下面會講解。

function

display(obj)

function fn(0)

我把fn(obj)的引號去掉了,這樣的寫法是錯誤的,這樣寫,fn會被立即呼叫,而不是500毫秒之後。

3.function:

function

display(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...