关键词搜索

源码搜索 ×
×

javascript的call和apply

发布2014-12-08浏览2065次

详情内容

coffeescript里,每个文件编译成JS后,都是(function(){...}).call(this);的架势

这个call,该怎么理解呢?

javascript里面,call 或者 apply 用于使并未定义某个函数的对象也可以使用该函数。换言之,它扩展了该对象,让它忽然多了一个函数。call与apply的区别,仅仅在于参数的形式。

  1. function sayHello(sentence){
  2. alert(sentence);
  3. }
  4. function leftfist(){}
  5. sayHello.call(leftfist,"Hello World!");
  6. sayHello.apply(leftfist,["Hello World!"]);

大概,这就是所谓的语法糖吧?网上的文章都说得很复杂,什么改变运行对象,上下文之类,这当然没有错,但我认为这会越说越复杂,越说越玄虚,无助于了解本质。不及我这个例子那么直达本质。CoffeeScript里这个编译后的call(this),倒真的是为了限定上下文。


在C#里面,也有类似的功能。它可以很方便地扩展一个现有类的功能,而不会引起已有代码的编译错误或什么变化。新加的功能,完全是额外赠送的,差不多二次开发的性质。

它就是this参数。

没代码我说个J8。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace ConsoleApplication1
  7. {
  8. using CustomExtensions;
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. string str = "leftfist";
  14. Console.WriteLine(str.HelloWorld());
  15. Console.Read();
  16. }
  17. }
  18. }
  19. namespace CustomExtensions
  20. {
  21. public static class StringExtensions
  22. {
  23. public static string HelloWorld(this string str)
  24. {
  25. StringBuilder sb = new StringBuilder(str);
  26. sb.Append(">Hello World!");
  27. return sb.ToString();
  28. }
  29. }
  30. }

上述代码中,string凭空获得了一个函数:HelloWorld()。




相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载