回答
仅当您使用call
或apply
时,您才可以修改函数内的this
上下文。
与其他语言不同 - 在JavaScript中this
不引用当前对象 - 而是引用执行上下文并可由调用者设置。
如果你调用一个函数使用new
关键字this
将正确引用新的对象(构造函数中)..
但在所有其他情况下 - this
将引用全局对象,除非通过设置明确请致电
如果使用'obj.whatever();'语法,它可能会引用调用者obj。 – 2016-06-17 14:13:52
声明“但在所有其他情况下 - 这将引用全局对象,除非通过调用明确设置”应该更正为:“但在其他所有情况下,除非通过调用明确设置,否则这将引用全局对象if在非严格模式下使用Ecmascript 3或Ecmascript 5(或更高版本),但在具有严格模式的Ecmascript 5(或更高版本)中,如果未明确设置,则始终未定义,并且JS引擎在您访问时会引发异常。请参阅:http://stackoverflow.com/questions/9822561/why-is-this-in-an-anonymous-function-undefined-when-using-strict – 2016-06-21 19:49:03
当您想要将不同的this
值传递给函数时,您使用call
或apply
。实质上,这意味着你想要执行一个函数,就像它是一个特定对象的方法一样。两者之间的唯一区别是call
期望参数以逗号分隔,而apply
需要数组中的参数。
从Mozilla's apply
page,其中构造被链接的一个例子:
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
构造被施加为在每个Food
和Toy
构造的函数,并且每个这些对象的实例正在作为this
传递。因此,Food
和Toy
中的每一个现在都具有this.name
和this.category
属性。
只是一个关于提供的代码片段的问题,为什么玩具和食品的原型被Product对象替换? – davids 2012-10-19 09:56:30
评论仅仅是碰到@davids问题:为什么我们需要做'Toy.prototype = new Product();'?我测试了这一点,删除这些行看起来没有什么区别,最终的结果。 – adrianp 2013-05-13 13:49:29
@davids&@adrianp:制作食品和玩具需要继承产品。看看这个例子:http://jsfiddle.net/Shawn/xNEYf/我删除了'Toy.prototype = new Product();'但是离开了'Food.prototype = new Product();'in,所以现在Food继承自产品,但玩具不。我还在Product的原型中添加了一个方法,并从Food and Toy中调用它以使缺乏继承更加明显(只需打开控制台并运行代码,Food可以调用从Product继承的方法,但Toy不能并引发错误) 。 – Shawn 2013-07-17 19:55:00
如果您有使用jQuery的经验,您会知道大多数函数都使用this
对象。例如,collection.each(function() { ... });
在此函数内部,"this"
引用迭代器对象。这是一种可能的用法。
我个人已经使用.apply()
来实现一个请求队列 - 我将一个参数数组插入到队列中,当执行它的时候,我接收一个元素并将其作为处理函数的参数传递使用.apply()
,因此如果必须传递一个参数数组作为第一个参数,那么代码更清晰。这是另一个例子。
通常,只要记住那些调用函数的方法存在,并且有一天您可能会发现它们方便地用于实现您的程序。
如果要使函数以不同的this
值执行,则使用.call()
。它根据指定设置this
值,根据指定设置参数,然后调用函数。 .call()
与仅执行该函数的区别在于函数执行时this
指针的值。当你正常执行这个函数时,javascript会决定指针的位置(通常是全局上下文window
,除非函数被调用为对象的方法)。当您使用.call()
时,您可以确切指定要将this
设置为的内容。
如果要传递给函数的参数在数组中,则使用.apply()
。 .apply()
也可以导致函数执行一个特定的this
值。 .apply()
最常用于来自其他来源的不确定数量的参数。它通常也用于通过使用特殊的局部变量arguments
将参数从一个函数调用传递到另一个函数调用,其中包含传递给当前函数的参数数组。
谢谢,你解释得很好。最后了解第一个参数的用法。 – 2012-07-21 13:50:22
我想不出任何将thisArg设置为不同的正常情况是使用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
然后调用和适用,如果你继承比较它才有意义,并从子类覆盖父类的属性或方法/功能。这与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
- 1. JavaScript调用()函数此上下文
- 2. 使用方法 - 传递上下文或调用/应用?
- 3. 在spring.net应用上下文中调用泛型方法
- 4. 如何在struts 1.1应用程序中使用外部js文件并在onclick事件上调用javascript函数?
- 5. 在jsf中使用javascript禁用动态上下文菜单
- 6. 在QTreeWidget中调用上下文菜单
- 7. 在进程上下文中调用kmap_atomic()
- 8. 在asp.net中调用上下文C#
- 9. 使用应用程序上下文
- 10. 在通用上下文中使用getActualTypeArguments
- 11. 是否有可能在javascript中获取调用者上下文?
- 12. 使用struts2在网络应用程序中上传文件并下载
- 13. 在我的应用程序中使用上下文菜单
- 14. 在junit测试类中重复使用spring应用上下文
- 15. 何时在泉中使用应用程序上下文。
- 16. 使用OAuth2在Javascript中下载文件
- 17. 使用回调的函数上下文
- 18. 使用javascript上下滚动
- 19. 从URL下载文本文件并使用JavaScript中的数据
- 20. 在.NET中使用Ajax调用后重新应用JavaScript/jQuery?
- 21. 在Firefox扩展中使用JavaScript调用Java应用程序(.jar)
- 22. 在Web应用程序中使用JavaScript调用C#函数
- 23. 使用存储过程“执行用户”并应用于调用上下文(会话)
- 24. 使用AppFabric调用上下文中的EventProvider ActivityId
- 25. JavaScript中的eval如何更改调用上下文?
- 26. 使用C#在FTP中并行使用多个下载/上传
- 27. 在不使用XMLHTTPRequest的情况下调用webservice并在Javascript中获取JSON响应
- 28. 在JavaScript中使用上下文参数的最佳方式
- 29. Apple是否允许在App Store中使用JavaScript上下文?
- 30. 使用扩展应用程序上下文的UI元素调用?
[该读(https://t.co/BVQPwfqqnO)帮助调用'适用()时,我明白thisArg'的'点'和'通话()'这似乎是你问题的核心。您需要了解Javascript中的函数调用原语 – 2015-10-26 20:54:35