zoukankan      html  css  js  c++  java
  • javascript的call和apply

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

    这个call,该怎么理解呢?

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

    function sayHello(sentence){
    	alert(sentence);
    }
    function leftfist(){}
    sayHello.call(leftfist,"Hello World!");
    sayHello.apply(leftfist,["Hello World!"]);

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


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

    它就是this参数。

    没代码我说个J8。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication1
    {
        using CustomExtensions;
        class Program
        {
            static void Main(string[] args)
            {
                string str = "leftfist";
                Console.WriteLine(str.HelloWorld());
                Console.Read();
            }
        }
    }
    namespace CustomExtensions
    {
        public static class StringExtensions
        {
            public static string HelloWorld(this string str)
            {
                StringBuilder sb = new StringBuilder(str);
                sb.Append(">Hello World!");
                return sb.ToString();
            }
        }
    }
    

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




  • 相关阅读:
    Thread.GetNamedDataSlot(String)
    .NET Core 常用加密和Hash工具NETCore.Encrypt
    .netcore在linux下使用P/invoke方式调用linux动态库
    IHttpAsyncHandler IHttpHandler
    Docker & ASP.NET Core 教程
    Docker在Linux上运行NetCore系列(一)配置运行DotNetCore控制台
    《异常检测》
    《awesome-AIOps》
    《Skyline 监控系统工作原理分析》
    《小团队撬动大数据——当当推荐团队的机器学习实践》
  • 原文地址:https://www.cnblogs.com/leftfist/p/4257833.html
Copyright © 2011-2022 走看看