上下文使用调用,并在Javascript中应用?

伙计们可以任何一个解释上下文使用callapply方法在JavaScript?

为什么要使用callapply而不是直接调用一个函数?

当你想传递一个不同的值给函数时,你使用call或者apply 。 实质上,这意味着你想要执行一个函数,就像它是一个特定对象的方法一样。 两者之间的唯一区别在于, call需要以逗号分隔的参数,而apply期望数组中的参数。

来自Mozilla apply页面的一个例子,其中构造函数链接在一起:

 function Product(name, price) { this.name = name; this.price = price; if (price < 0) throw RangeError('Cannot create product "' + name + '" with a negative price'); return this; } function Food(name, price) { Product.apply(this, arguments); this.category = 'food'; } Food.prototype = new Product(); function Toy(name, price) { Product.apply(this, arguments); this.category = 'toy'; } Toy.prototype = new Product(); var cheese = new Food('feta', 5); var fun = new Toy('robot', 40); 

什么Product.apply(this, arguments)所做的是: Product构造函数作为一个函数在每个FoodToy构造函数中应用,并且每个这样的对象实例都被传递。 因此, FoodToy每个现在都有this.namethis.category属性。

只有当你使用callapply你可以修改this函数内的上下文。

不像其他语言 – 在JavaScript中, this不是指当前对象 – 而是指向执行上下文,可以由调用者设置。

如果您使用new关键字调用函数,则会正确引用新对象(在构造函数内)。

但在所有其他情况下 – 除非通过调用明确设置,否则将引用全局对象

如果要使函数以不同的值执行,则可以使用.call() 。 它按照指定设置this值,根据指定设置参数,然后调用函数。 .call()和仅执行该函数的区别在于该函数执行时this指针的值。 当你正常的执行这个函数时,javascript会决定this指针是什么(通常是全局上下文window除非这个函数是作为一个对象的方法调用的)。 当你使用.call() ,你可以指定你想要设置的内容。

当要传递给函数的参数位于数组中时,可以使用.apply().apply()也可以使函数执行一个特定的值。 .apply()最常用于来自其他源的不确定数量的参数。 通常也使用传递给当前函数的参数数组的特殊局部variablesarguments将参数从一个函数调用传递给另一个函数。

我发现MDN引用页面.call()和.apply()有帮助。

如果你有使用jQuery的经验,你会知道大多数函数都使用this对象。 例如, collection.each(function() { ... }); 在这个函数里面, "this"是指迭代器对象。 这是一个可能的用法。

我个人使用.apply()来实现一个请求队列 – 我将一个参数数组推入队列,当执行它的时候,我接收一个元素,并将其作为处理函数的parameter passing.apply() ,从而使代码更清晰,然后如果必须传递一个参数数组作为第一个参数。 这是另一个例子。

一般来说,只要记住那些调用函数的方法,并且有一天你可能会发现它们方便地用来实现你的程序。

我想不出任何正常的情况,把这个arg设置成不同的东西是使用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] 

如果你有Object Oriented Programming方面的经验,那么如果你将它与inheritance进行比较,并且从子类中覆盖父类的属性或方法/函数,调用和应用将是有意义的。 与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