java比較 上下文使用調用並在Javascript中應用?




javascript語法 (5)

伙計們可以解釋上下文在JavaScript中使用callapply方法嗎?

為什麼使用callapply而不是直接調用一個函數?


只有當你使用callapply你才可以在函數內修改this上下文。

不像其他語言 - 在JavaScript中, this不是指當前對象 - 而是指向執行上下文,並且可以由調用者設置。

如果你使用new關鍵字調用一個函數, this將正確引用新對象(在構造函數中)。

但在所有其他情況下 - 除非通過調用明確設置,否則this將引用全局對象


如果您有Object Oriented Programming方面的經驗,那麼如果您將它與繼承進行比較並覆蓋子類中父類的屬性或方法/函數,則調用和應用將很有意義。 與javascript中的調用類似,如下所示:

function foo () {
  this.helloworld = "hello from foo"
}
foo.prototype.print = function () {
  console.log(this.helloworld)
}

foo.prototype.main = function () {
  this.print()
}


function bar() {
  this.helloworld = 'hello from bar'
}
// declaring print function to override the previous print
bar.prototype.print = function () {
  console.log(this.helloworld)
}

var iamfoo = new foo()

iamfoo.main() // prints: hello from foo

iamfoo.main.call(new bar()) // override print and prints: hello from bar

我想不出任何將thisArg設置為不同的正常情況是使用apply的目的。

apply的目的是將一個值的數組傳遞給一個需要這些值作為參數的函數。

它已被傳播運營商在所有常規日常使用中所取代。

例如

// Finding the largest number in an array
`Math.max.apply(null, arr)` becomes `Math.max(...arr)`

// Inserting the values of one array at the start of another
Array.prototype.unshift.apply(arr1, arr2); 
// which becomes 
arr1 = [...arr2, ...arr1]

如果你有使用jQuery的經驗,你會知道大多數函數都使用this對象。 例如, collection.each(function() { ... }); 在這個函數內部, "this"指向迭代器對象。 這是一種可能的用法。

我個人使用.apply()實現了一個請求隊列 - 我將一個參數數組插入到隊列中,當執行它的時候,我接收一個元素,並將它作為處理函數的參數傳遞.apply() ,因此如果必須傳遞一個參數數組作為第一個參數,那麼代碼更清晰。 這是另一個例子。

一般來說,只要記住那些調用函數的方法存在,並且您有一天會發現它們方便地用於實現您的程序。


如果要使函數以不同的值執行,則可以使用.call() 。 它按照指定設置this值,根據指定設置參數,然後調用該函數。 .call()和僅執行該函數的區別在於該函數執行時this指針的值。 當你正常執行這個函數時,javascript會決定this指針是什麼(通常是全局上下文window除非該函數是作為對象的方法調用的)。 當你使用.call() ,你指定了你想要設置的內容。

當要傳遞給函數的參數位於數組中時,可以使用.apply().apply()也可以使函數以特定的值執行。 .apply()最常用於來自其他源的不確定數量的參數。 它通常也使用特殊的局部變量arguments將參數從一個函數調用傳遞到另一個函數調用,其中包含傳遞給當前函數的參數數組。

我發現MDN引用.call().apply()頁面很有幫助。





javascript