• S1:函数上下文


    函数的上下文是可以变化的,因此,函数内的this也是可以变化的,函数可以作为一个对象的方法,也可以同时作为另一个对象的方法,总之,函数本身是独立的。可以通过Function对象上的call或者apply函数来修改函数的上下文:

    //定义一个全局的函数对象
    function printName(){
        return this.name;
    }
    //设置printName的上下文为jack, 此时的this为jack
    print(printName.call(jack));
    //设置printName的上下文为abruzzi,此时的this为abruzzi
    print(printName.call(abruzzi));
    
    print(printName.apply(jack));
    print(printName.apply(abruzzi));
    
    //只有一个参数的时候call和apply的使用方式是一样的,如果有多个参数:
    setName.apply(jack, ["Jack Sept."]);
    print(printName.apply(jack));
    
    setName.call(abruzzi, "John Abruzzi");
    print(printName.call(abruzzi));

     上下文的引用

    在前端JavaScript开发中,一个常见的错误是错将this类比为其他的外部局部变量:

    $(function(){
        var con = $("div#panel");
        this.id = "content";
        con.click(function(){
            alert(this.id);//panel
        });
    });    


    此处的alert(this.id)到底引用着什么值呢?很多开发者可能会根据闭包的概念,做出错误的判断:
    content
    理由是,this.id显示的被赋值为content,而在click回调中,形成的闭包会引用到this.id,因此返回值为content。然而事实上,这个alert会弹出”panel”,究其原因,就是此处的this,虽然闭包可以引用局部变量,但是涉及到this的时候,情况就有些微妙了,因为调用对象的存在,使得当闭包被调用时(当这个panel的click事件发生时),此处的this引用的是con这个jQuery对象。而匿名函数中的this.id = “content”是对匿名函数本身做的操作。两个this引用的并非同一个对象。
    如果想要在事件处理函数中访问这个值,我们必须做一些改变:

    $(function(){
        var con = $("div#panel");
        this.id = "content";
        var self = this;
        con.click(function(){
            alert(self.id);//content
        });
    });    

    这样,我们在事件处理函数中保存的是外部的一个局部变量self的引用,而并非this,这种技巧在实际应用中多有应用。


    作者:狂流
    出处:http://www.cnblogs.com/kuangliu/
    欢迎转载,分享快乐! 如果觉得这篇文章对你有用,请抖抖小手,推荐一下!

  • 相关阅读:
    不使用动态sql语句,正确书写case when中的null处理
    VC项目配置详解(转)
    JAXWS 访问SSL 的WebService 老是HTTP transport error: Connection refused错误的解决办法。
    [转]为什么开发人员工作10多年了还会迷茫?没有安全感?
    Tomcat 6.0.24 不兼容的APR版本问题
    WPF滚动条嵌套,响应鼠标滑轮事件的处理
    SqlServer无备份下误删数据恢复
    今天发现竟然有一个粉丝!!!
    好用的开源轻量级DHCP和DNS服务软件“Dual DHCP DNS Server”
    Windows下源码获取
  • 原文地址:https://www.cnblogs.com/kuangliu/p/3923707.html
Copyright © 2020-2023  润新知