zoukankan      html  css  js  c++  java
  • javascript中this实例及理解


    一般而言,在Javascript中,this指向函数执行时当前对象。如a.b()的a,而b()一般指向window。

    访问变量则向上访问执行环境,执行环境包括函数环境和全局环境。

    一。对象内this探索

    (1)

        var c = 6;
        var a = {
            c:5,
            b:function(){return this.c}
        }
        console.log(a.b())//5

    这个this指的是a的context

    (1)去掉a.c后,返回undefined

        var c = 6;
        var a = {
    
            b:function(){return this.c}
        }
        console.log(a.b())//undefined

    这个this指的是a的context

    (1)若改变当前对象

        var c = 6;
        var a = {
            b:function(){return this.c}
        }
        var d = a.b
        console.log(d())//6

    (1)去掉this,返回window.c,此时执行环境栈,[0]是window,[1]是b function()

        var c = 6;
        var a = {
            c:5,
            b:function(){return c}
        }
        console.log(a.b())//6

    二。闭包内this

    (2)

        var c = 6;
        var a = (function(){
            var c = 5;
            var b = function(){return c};
            return {B:b}
        })()
        console.log(a.B())//5

     共有方法B访问匿名函数环境下的c

    (2)去掉a.c,返回6

        var c = 6;
        var a = (function(){
            var b = function(){return c};
            return {b:b}
        })()
        console.log(a.b())//6

    (2)c改为this.c,返回undefined

        var c = 6;
        var a = (function(){
            var c = 5;
            var b = function(){return this.c};
            return {b:b}
        })()
      console.log(a.b())//undefined

    这个this指的是a的公有context,即{b:b}

    (2)c改为this.c,return 加上c:c,返回5

        var c = 6;
        var a = (function(){
            var c = 5;
            var b = function(){return this.c};
            return {b:b,c:c}
        })()
        console.log(a.b())//5

    这个this指向{b:b,c:c}context

     另一个例子

    var name = "The Window";
    var object = {
    name : "My Object",
    getNameFunc : function(){
    return function(){
    return this.name;
    };
    }
    };
    alert(object.getNameFunc()()); //"The Window"

     匿名函数处于window环境下,因此this指向window

    在闭包中使用 this 对象也可能会导致一些问题。我们知道, this 对象是在运行时基于函数的执
    行环境绑定的:在全局函数中, this 等于 window,而当函数被作为某个对象的方法调用时, this 等
    于那个对象。不过,匿名函数的执行环境具有全局性,因此其 this 对象通常指向 window。但有时候
    由于编写闭包的方式不同,这一点可能不会那么明显。每个函数在被调用时都会自动取得两个特殊变量:

    this 和 arguments。内部函数在搜索这两个变量时,只会搜索到其活动对象为止,因此永远不可能直接

    访问外部函数中的这两个变量。

    执行环境及作用域(出自javascript高级程序设计)


    执行环境(execution context,为简单起见,有时也称为“ 环境”)是 JavaScript 中最为重要的一个概
    念。执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为。每个执行环境都有一个
    与之关联的变量对象(variable object) ,环境中定义的所有变量和函数都保存在这个对象中。虽然我们
    编写的代码无法访问这个对象,但解析器在处理数据时会在后台使用它。
    全局执行环境是最外围的一个执行环境。根据 ECMAScript 实现所在的宿主环境不同,表示执行环
    境的对象也不一样。在 Web 浏览器中,全局执行环境被认为是 window 对象(第 7 章将详细讨论) ,因
    此所有全局变量和函数都是作为 window 对象的属性和方法创建的。某个执行环境中的所有代码执行完
    毕后,该环境被销毁,保存在其中的所有变量和函数定义也随之销毁(全局执行环境直到应用程序退
    出——例如关闭网页或浏览器——时才会被销毁)。
    每个函数都有自己的执行环境。当执行流进入一个函数时,函数的环境就会被推入一个环境栈中。
    而在函数执行之后,栈将其环境弹出,把控制权返回给之前的执行环境。 ECMAScript 程序中的执行流
    正是由这个方便的机制控制着。
    当代码在一个环境中执行时,会创建变量对象的一个作用域链(scope chain)。作用域链的用途,是
    保证对执行环境有权访问的所有变量和函数的有序访问。作用域链的前端,始终都是当前执行的代码所
    在环境的变量对象。如果这个环境是函数,则将其活动对象(activation object)作为变量对象。活动对
    象在最开始时只包含一个变量,即 arguments 对象(这个对象在全局环境中是不存在的)。作用域链中
    的下一个变量对象来自包含(外部)环境,而再下一个变量对象则来自下一个包含环境。这样,一直延
    续到全局执行环境;全局执行环境的变量对象始终都是作用域链中的最后一个对象。
    标识符解析是沿着作用域链一级一级地搜索标识符的过程。搜索过程始终从作用域链的前端开始,
    然后逐级地向后回溯,直至找到标识符为止(如果找不到标识符,通常会导致错误发生)。

  • 相关阅读:
    C# 从服务器下载文件
    不能使用联机NuGet 程序包
    NPOI之Excel——合并单元格、设置样式、输入公式
    jquery hover事件中 fadeIn和fadeOut 效果不能及时停止
    UVA 10519 !! Really Strange !!
    UVA 10359 Tiling
    UVA 10940 Throwing cards away II
    UVA 10079 Pizze Cutting
    UVA 763 Fibinary Numbers
    UVA 10229 Modular Fibonacci
  • 原文地址:https://www.cnblogs.com/xiaokangzhu/p/4900060.html
Copyright © 2011-2022 走看看