首页 > 编程语言 >[JavaScript-10]this指向

[JavaScript-10]this指向

时间:2022-11-11 13:11:55浏览次数:48  
标签:function 10 console log 指向 JavaScript var obj foo

1. 默认绑定

// 全局环境指向window
console.log(this);
// 函数独立调用,函数内部this指向window
function fn()
{
    console.log(this);
}
fn();

// 函数当做对象方法来调用,this指向对象
var x = 666;
var obj = 
{
    a:2,
    foo:function ()
    {
        console.log(this);
        var that = this;
        function test()
        {
            // 被嵌套的函数独立调用,this指向window
            console.log(this);
            console.log('x:',this.x);
            // console.log('x:',x); // let这么写
            console.log(that.a);
        }
        test();
    }
}
obj.foo()


2. IIFE自调用函数

// 函数当做对象方法来调用,this指向对象
var x = 666;
var obj = 
{
    a:2,
    foo:function ()
    {
        console.log(this);
        var that = this;
        function test()
        {
            // 被嵌套的函数独立调用,this指向window
            console.log(this);
            console.log('x:',this.x);
            // console.log('x:',x); // let这么写
            console.log(that.a);
        }
        test();
    }
}
obj.foo()

// IIFE自调用函数
var aa =10;
function fooo()
{
    console.log(this);
    (function test(that) // that 获取 this值 obj1
        {
            // 自调用指向window
            console.log(this);
            console.log(this.aa);
            console.log(that.a);
        }
    )(this); // 自调用传参this obj1
}
var obj1 =
{
    a       :2,
    foooo   :fooo // 函数赋值给foooo
}
obj1.foooo();

3. 隐式绑定

// 当函数当做obj对象的方法来调用,this指向当前的obj
function foo()
{
    console.log(this.a);
}
var obj = 
{
    a   :   1,
    foo :   foo,
    obj2:
    {
        a   :   2,
        foo :   foo
    }
}
// foo()直接指向obj
obj.foo();
// foo()直接指向obj2 
obj.obj2.foo();

4. 隐式丢失

4.1 赋值丢失

// 隐式丢失
// 当函数内的方法被赋值给一个变量的时候,则出现隐式丢失
var a = 0;
function foo()
{
    console.log(this.a);
}
var obj = 
{
    a   :   1,
    foo :   foo,
}
var bar = obj.foo;
// 把obj.foo()赋值给别名bar,造成隐式丢失
bar(); //0

4.2 传参丢失

// 当函数内方法被当做参数传递后,会出现隐式丢失
var b = 0;
function fooo()
{
    console.log(this.b);
}
// 传进来的fn是一个函数
function barr(fn)
{
    fn();
}
var obj1 =
{
    b:1,
    fooo:fooo
}
// 把obj1.fooo当做参数传递到barr(fn)就是赋值给fn
barr(obj1.fooo) //0

4.3 内置函数调用

// setTimeout() 载入一次执行后,延时一定时间后,再执行一次表达式;被动触发
// setInterval() 载入后立即进入计算状态,每隔指定时间救赎执行一次表达式;主动触发
setTimeout(
    function()
    {
        console.log(this);
    },
    1000
);

var a = 10;
function foo()
{
    console.log(this.a);
}
var obj =
{
    a:1,
    foo:foo
}
setTimeout(obj.foo,1000) //10

4.4 间接调用

// 间接调用
var a =2;
function foo()
{
    console.log(this.a);
}
var obj =
{
    a:3,
    foo:foo
}
var p =
{
    a:4,
    b:5
};
obj.foo(); //3
// 函数立即调用,内部this指向window
// p对象 添加新的方法
(p.foo = obj.foo)() //2
p.foo = obj.foo;
p.foo(); //4 

标签:function,10,console,log,指向,JavaScript,var,obj,foo
From: https://www.cnblogs.com/leoshi/p/16880179.html

相关文章

  • Ubuntu 21.10 (Impish Indri) Reached End of Life, Upgrade to Ubuntu 22.04 LTS Now
    https://9to5linux.com/ubuntu-21-10-impish-indri-reached-end-of-life-upgrade-to-ubuntu-22-04-lts-now......
  • OX5021-EAE-1080-20M000恒温晶体振荡器 (OCXO) 小型蜂窝、低功耗
    OX-502恒温晶体振荡器(OCXO)将小尺寸、低功耗、快速预热以及在气流下保持稳定等特性完美结合在一起。OX-502的特性包括±10ppb超温稳定性、±3ppm10年老化以及±2ppb/C频......
  • SBT10100VCT-ASEMI肖特基二极管SBT10100VCT
    编辑:llSBT10100VCT-ASEMI肖特基二极管SBT10100VCT型号:SBT10100VCT品牌:ASEMI封装:TO-220AB特性:肖特基二极管正向电流:10A反向耐压:100V恢复时间:5ns引脚数量:3芯片个数:2芯片尺寸:58......
  • SBT10100VCT-ASEMI肖特基二极管SBT10100VCT
    编辑:llSBT10100VCT-ASEMI肖特基二极管SBT10100VCT型号:SBT10100VCT品牌:ASEMI封装:TO-220AB特性:肖特基二极管正向电流:10A反向耐压:100V恢复时间:5ns引脚数量:3芯片个数......
  • 10:子查询-MySQL
    目录​​10.1子查询基本语法​​​​10.2in和notin​​​​10.3exists和notexists​​​​10.4基础结束语​​10.1子查询基本语法将一个查询的结果作为另一个查......
  • centos8 yum安装docker 20.10.21 failed to load listeners: no sockets found via so
    vim/usr/lib/systemd/system/docker.serviceExecStart=/usr/bin/dockerd-Hunix://--containerd=/run/containerd/containerd.sock#ExecStart=/usr/bin/dockerd-Hfd......
  • 「题解」Codeforces 1098D Eels
    暴力是,每次挑出最小的两个合并。需要观察到没有产生贡献的次数很小。考虑最小的那个数的大小,如果一次合并没有产生贡献,那么最小的数至少\(\times2\).所以最多会有\(\mat......
  • [A202211110354]
    [A202211110354](2022,南开大学)设\(x_n=\displaystyle\sum_{k=0}^n{\frac{1}{k!}}\),\(n=1,2,\cdots\),求极限\[\lim_{n\rightarrow\infty}\left(\frac{\lnx_n}{\sqr......
  • [A202211110303]
    [A202211110303](2022,同济大学)已知\(\{a_n\}\)是一个实数列,\(0<|\lambda|<1\).证明:\(\displaystyle\lim_{n\rightarrow\infty}a_n=a\)的充要条件是\[\lim_{n\rig......
  • GL-Polite Behavior 20221101
    PolitebehaviorTime2022.11.01Tuesday23:00-23:45Whenitcomestomannersandetiquette,everycountryseemstohaveitsownsetofrules.Discusswhatis......