zoukankan      html  css  js  c++  java
  • this基础(转)

    var someuser = { 
        name: 'byvoid', 
        func: function() {
            console.log(this.name); 
        }
    }; 
    var foo = { 
        name: 'foobar'
    };
     
    someuser.func(); // 输出 byvoid
     
    foo.func = someuser.func; 
    foo.func(); // 输出 foobar
     
    name = 'global';
    func = someuser.func; 
    func(); // 输出 global

    在 JavaScript 中,上下文对象就是 this 指针,即被调用函数所处的环境。上下文对象的作用是在一个函数内部引用调用它的对象本身。
    在 JavaScript 中,本质上,函数类型的变量是指向这个函数实体的一个引用,在引用之间赋值不会对对象产生复制行为。我们可以通过函数的任何一个引用调用这个函数,不同之 处仅仅在于上下文。
    仔细观察上面的例子,使用不同的引用来调用同一个函数时,this 指针永远是这个引用所属的对象。

    var scope = 'top';
    var f1 = function() { 
        console.log(scope);
    };
    f1(); // 输出 top
    var f2 = function() { 
        var scope = 'f2'; 
        f1();
    };
    f2(); // 输出 top

    函数作用域的嵌套关系是定义时决定的,而不是调用时决定的,也就 是说,JavaScript 的作用域是静态作用域,又叫词法作用域,这是因为作用域的嵌套关系可 以在语法分析时确定,而不必等到运行时确定。

    请看下面的实例:

    function test() {
        alert(arg);
        var arg = 1;
    }
    test();

    这段代码在运行时报错“undefined”

    function test() {
        alert(arg);
        this.arg = 1;
    }
    test();
    

    这段代码在编译时报错“arg is not defined”

    var arg = 2;
    function test() {
        alert(arg);
        var arg = 1;
    }
    test();

    这段代码依然是在运行时报错“undefined”

    var arg = 2;
    function test() {
        alert(arg);
        this.arg = 1;
    }
    alert(arg);
    test();
    alert(arg);

    这段代码运行正常,三次的显示分别是:2、2、1。可见函数内的this.arg改变了全局变量的值,也就是现在this指代的是window对象。也就是上面的代码等价于下面的代码:

    var arg = 2;
    function test() {
        alert(arg);
        this.arg = 1;
    }
    alert(arg);
    window.test();
    alert(arg);

    我们换一个对象实例看看:

    var arg = 2;
    function test() {
        alert(arg);
        this.arg = 1;
    }
    alert(arg);
    var t = new test();
    alert(t.arg);
    alert(arg);

    现在,前后全局变量arg的值未发生变化,说明当前的this指代的是t不再是window。

    我们再次进行验证:

    function test() {
        this.arg = 1;
    }
    test();
    alert(arg);

    此时弹出1,验证ok!可见函数和变量默认的属主就是window对象。

    我们再实验一个例子:

    function test() {
        var arg = 1;
        alert(arg);
    }
    test();
    alert(arg);

    此代码先弹出1,再报编译时错误“arg is not defined”,可见函数内的arg只是局部变量不影响window对象,window.arg依然未定义。

    我们发挥想象力进一步拓展:

    function test() {
        this.msg = function(i){alert(i);}
    }
    test();
    msg('ok');

    上面的代码如愿的弹出了“ok”!因为msg也不过是一个指向函数的指针变量,它指向了一个无名函数,当执行test时,此函数即时创建,同样属于window的属性。

    实验一个指向函数变量的非this例子

    function test() {
        var msg = function(i){alert(i);}
        msg(1);
    }
    test();
    msg(2);

    上面的代码,先弹出“1”,然后报编译错误“msg(2):msg is not defined”。可见函数内没有this修饰的msg只是函数内局部可用的函数指针,外部无法调用。


    总结:对于函数内的变量(包括指向函数的指针变量)来说,this关键字总是指代调用该函数的对象。当单独调用函数时,调用它的对象由window引用;当用var t = new test()方式调用时调用它的对象由t引用。

      

  • 相关阅读:
    openwrt 相关文章
    负载均衡相关文章
    Today's Progress
    Rodrigues formula is beautiful, but uneven to sine and cosine. (zz Berkeley's Page)
    Camera Calibration in detail
    Fundamental Matrix in Epipolar
    Camera Calibration's fx and fy do Cares in SLAM
    FilterEngine::apply
    FilterEngine 类解析——OpenCV图像滤波核心引擎(zz)
    gaussBlur
  • 原文地址:https://www.cnblogs.com/huangfenggu/p/4283233.html
Copyright © 2011-2022 走看看