zoukankan      html  css  js  c++  java
  • 开心菜鸟系列学习笔记------javascript(5)


        一、this的关系
        1)全局代码中的this
        2)函数代码中的this
    在函数代码中使用this时很有趣,这种情况很难且会导致很多问题。

    这种类型的代码中,this值的首要特点(或许是最主要的)是它不是静态的绑定到一个函数。

    正如我们上面曾提到的那样,this是进入上下文时确定,在一个函数代码中,这个值在每一次完全不同。

    不管怎样,在代码运行时的this值是不变的,也就是说,因为它不是一个变量,就不可能为其分配一个新值(相反,在Python编程语言中,它明确的定义为对象本身,在运行期间可以不断改变)。
       
    那么,影响了函数代码中this值的变化有几个因素:

    首先,在通常的函数调用中,this是由激活上下文代码的调用者来提供的,即调用函数的父上下文(parent context )。this取决于调用函数的方式。

    为了在任何情况下准确无误的确定this值,有必要理解和记住这重要的一点。正是调用函数的方式影响了调用的上下文中的this值,没有别的什么(我们可以在一些文章,甚至是在关于javascript的书籍中看到,它们声称:“this值取决于函数如何定义,如果它是全局函数,this设置为全局对象,如果函数是一个对象的方法,this将总是指向这个对象。–这绝对不正确”)。继续我们的话题,可以看到,即使是正常的全局函数也会被调用方式的不同形式激活,这些不同的调用方式导致了不同的this值。
       
    在一个函数上下文中,this由调用者提供,由调用函数的方式来决定。如果调用括号()的左边是引用类型的值,this将设为引用类型值的base对象(base object),在其他情况下(与引用类型不同的任何其它属性),这个值为null。不过,实际不存在this的值为null的情况,因为当this的值为null的时候,其值会被隐式转换为全局对象。注:第5版的ECMAScript中,已经不强迫转换成全局变量了,而是赋值为
    引用类型的值只有两种情况:
    1.    当我们处理一个标示符时
    2.    或一个属性访问器
    标示符的处理过程在下一篇文章里详细讨论,在这里我们只需要知道,在该算法的返回值中,总是一个引用类型的值(这对this来说很重要)。
    var foo = {
      bar: function () {
        alert(this);
      }
    };
     
                foo.bar(); // Reference, OK => foo
                (foo.bar)(); // Reference, OK => foo

                (foo.bar = foo.bar)(); // global?
                (false || foo.bar)(); // global?
                (foo.bar, foo.bar)(); // global?

                为什么我们有一个属性访问器,它的中间值应该为引用类型的值,在某些调用中我们得到的this值不是base对象,而是global对象?

                问题在于后面的三个调用,在应用一定的运算操作之后,在调用括号的左边的值不在是引用类型。
                1.第一个例子很明显———明显的引用类型,结果是,this为base对象,即foo。
                2.在第二个例子中,组运算符并不适用,想想上面提到的,从引用类型中获得一个对象真正的值的方法,如GetValue。相应的,在组运算的返回中———我们得到仍是一个引用类型。这就是this值为什么再次设为base对象,即foo。
                3.第三个例子中,与组运算符不同,赋值运算符调用了GetValue方法。返回的结果是函数对象(但不是引用类型),这意味着this设为null,结果是global对象。
                4.第四个和第五个也是一样——逗号运算符和逻辑运算符(OR)调用了GetValue 方法,相应地,我们失去了引用而得到了函数。并再次设为global
                下面有引用:

     var x = 2;
      with({
      a:function ()
      {
       console.info(this.x);
      },  
      x:3
     })
     {
      a(); //function a();
     }
        try
        {
            throw function ()
            {
                console.info(this);
            }   
        }
        catch(e)
        {
            e(); //window.html
        }

  • 相关阅读:
    java:Spring框架4(Project,ER图)
    java:Spring框架3(AOP,SSH集成Demo)
    java:LeakFilling(Spring)
    java:Spring框架2(bean的作用域,静态工厂和实例工厂,自动装配,动态代理)
    java:Spring框架1(基本配置,简单基础代码模拟实现,spring注入(DI))
    java:Hibernate框架4(延迟加载(lazy),抓取(fetch),一级缓存,get,load,list,iterate,clear,evict,flush,二级缓存,注解,乐观锁和悲观锁,两者的比较)
    java:Hibernate框架3(使用Myeclipse逆向工程生成实体和配置信息,hql语句各种查询(使用hibernate执行原生SQL语句,占位符和命名参数,封装Vo查询多个属性,聚合函数,链接查询,命名查询),Criteria)
    java:Hibernate框架2(关联映射(多对一,一对多,一对多双向,一对一主键,一对一唯一外键,多对多双向))
    Tomcat/7.0.81 远程代码执行漏洞复现
    Discuz!X 3.4 前台任意文件删除漏洞复现
  • 原文地址:https://www.cnblogs.com/kaixincainiao/p/3415627.html
Copyright © 2011-2022 走看看