setTimeout的第乙個引數出錯問題

2021-08-04 17:41:58 字數 1419 閱讀 1131

今天有人在群裡問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 命令即可啟動互動式程式設計。互動式程式設計 互動式程式設計不需要建立指令碼檔案,是...

第乙個部落格

我不知道為什麼 我在csdn上創了乙個賬號,又開通了部落格。也許我不是名人,也許幻想著成為名人。在這裡 我不會給任何人許諾,這個部落格可能有乙個博文 有兩個博文 或者會有很多 很多 很多。不過讓我有個大膽的猜想,如果這個部落格在今後有很多很多自己寫的博文,說明我成功了 在自己眼裡 也說明這個方法時正...