[英]Javascript function implementation
我有這樣的代碼:
(function() {
$(document).ready(function() {
//event handlers
$('.project-delete').on('click', function() {
deleteProject($(this));
});
$('.keyword-delete').on('click', function() {
deleteKeyword($(this));
});
this.deleteKeyword = function(model) {
}
}).call(this);
我很好奇,如果這是一個很好的方法,因為我最近學習JS,據我所知,這個函數將具有全局范圍,不是嗎? 既然.call(this)
將窗口對象傳遞給此閉包,那么我認為它不是最好的選擇嗎? 有什么我想念的嗎? 將.call(this)
改為just ()
改變什么嗎?
編輯:那么將窗口對象傳遞給該閉包是否可以? 傳遞一個空對象或jQuery對象不是更好嗎?
假設這個函數是在全局范圍內所定義的, deleteKeyword
函數將具有也有全球范圍,因為this
在父功能的上下文中基本上是window
(其已經通過在作為this
從外部;在全球范圍內this === window
)。
如果將.call(this)
更改為just ()
, this
仍然是函數內部的window
。 這是因為當您通過簡單的函數調用調用函數時, this
其設置為全局對象,即window
。
如果你想為一個不同的值this
,您將需要通過別的東西來傳遞.call
或.apply
。
有關的行為的詳細信息, this
,看看這里 。
“據我所知,這個功能將具有全球范圍,不是嗎?”
“范圍”是關於什么的變量函數可以訪問(即自己的局部變量,再加上它可能是內嵌套的任何函數聲明本地人,再加上全局變量),並具有無關的值this
。 范圍取決於函數聲明,但是this
取決於函數是如何被調用。
“因為
.call(this)
將window
對象 傳遞 給此閉包”
我們無法從顯示的代碼中分辨出來。 大概你的意思是那個代碼塊沒有嵌套在其他函數中,所以是的, this
就是window
。 但是如果該代碼曾經粘貼在其他函數中,那么this
可能具有其他值,具體取決於調用其他函數的方式。
“將
.call(this)
改為just()
改變什么嗎?”
如果你使用just ()
意味着在函數內部this
將是window
。 這是否會改變任何東西取決於.call(this)
的this
是否首先是window
- 正如我上面已經提到的,如果該塊嵌套在其他函數中, this
可能是其他的。 話雖如此,對於所顯示的代碼, 如果this
不是window
我認為你的代碼會破壞。 因為你聲明了這樣的函數:
this.deleteKeyword = function(model) {...}
...然后在第二個單擊處理程序內部,你調用我認為是相同的函數而不使用this
:
deleteKeyword($(this));
唯一可行的方法是,如果this
是window
,則deleteKeyword()
函數是全局的。 如果this
是任何其他對象,則該函數將是該另一個對象的屬性,因此不能直接作為deleteKeyword()
訪問。 但是,除非你特別想要deleteKeyword()
可訪問從其他未顯示的代碼也沒有理由將其創建為的屬性this
在所有。 只需用var
聲明它:
var deleteKeyword = function(...
...然后它只能在該函數內部以及嵌套在其中的函數(例如您的單擊處理程序)中訪問。 函數末尾的.call()
將是多余的,因為函數實際上不會使用this
。
“因此,將jQuery對象(或者可能只是空對象)應用於它以提高性能是不是更好的選擇?如果它指向本地范圍,它不會提高性能嗎?因為窗口對象非常慢。”
還有我已經說過,“范圍”和價值this
是無關的概念。 我不確定你為什么擔心該代碼的性能。 但是,如果您使用.call(jQuery)
或.call({})
應用jQuery或空對象,則代碼將無法正常工作,如上所述。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.