• 开心菜鸟系列学习笔记------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
        }

  • 相关阅读:
    Pull Request
    选择器
    常见HTTP状态码
    286. Walls and Gates
    200. Number of Islands
    1. Two Sum
    名片管理系统(python实现)
    k近邻算法(简单版)
    基数排序
    递归算法的调试
  • 原文地址:https://www.cnblogs.com/kaixincainiao/p/3415627.html
Copyright © 2020-2023  润新知