zoukankan      html  css  js  c++  java
  • 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/
    欢迎转载,分享快乐! 如果觉得这篇文章对你有用,请抖抖小手,推荐一下!

  • 相关阅读:
    jsTree展开根节点 设置用户图标
    Js图片缩放代码 鼠标滚轮放大缩小 图片向右旋转
    MySQL删除重复数据
    200道物理学难题——001 三只蜗牛
    慎用GetOpenFileName
    Windows7隐藏字体
    Windows 位图
    Windows 调色板
    C++模板特化
    使用Visual Studio制作安装包
  • 原文地址:https://www.cnblogs.com/kuangliu/p/3923707.html
Copyright © 2011-2022 走看看