簡體   English   中英

Javascript函數實現

[英]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));

唯一可行的方法是,如果thiswindow ,則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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM