【Day27】this - 简易呼叫(Simple Call)

简易呼叫(Simple Call)

当我们直接执行函式时,就是所谓的简易呼叫(Simple Call),

以下会列出各种简易呼叫(Simple Call)的范例:

函式

var myName = 'weiwei';

function callName() {
    var myName = '小明';
    console.log(this);
    console.log(this.myName);
};

callName();

该范例我们直接使用 callName() 来执行函式,

这就是所谓的简易呼叫(Simple Call),

而此时的 this 是指向全域,所以会回传全域中的 myName

立即函式

var myName = 'weiwei';

(function(){
    console.log(this.myName);
    function callSomeone(){
        var myName = '小明';
        console.log(this);
        console.log(this.myName);
    };
    callSomeone();
})();

在该范例中,我们直接在立即函式中执行 callSomeone() 也是属於 Simple Call,

因此在 callSomeone()this 也是指向全域,所以也会回传全域中的 myName

闭包

var myName = 'weiwei';

function myMoney(money){
    return function(update){
        var myName = '小明';
        money += update;
        console.log(this.myName, money);
    }
}

const weiMoney = myMoney(200);

weiMoney(50);  // weiwei 250

该范例中,我们直接使用 weiEasyCard(50) 来执行 easyCard(base)retuen 的函式,

这也属於 Simple Call,因此这边的 this 也是指向全域

callback function

var myName = 'weiwei';

function myMoney(callback){
    var myName = '小明';
    const money = 100;
    return callback(money);
}

myMoney(function(money) {
    console.log(this.myName, money + 100);  // weiwei 200
});

范例中 callback function 是将函式作为参数带入 myMoney() 中,

使用 myMoney() 来执行带入的函式,而这也是属於 Simple Call

callback function 除了自己写之外,

在 JavaScript 中有许多内建的 callback function,

forEach 为例:

var myName = 'weiwei'

const a = [1, 2, 3];

a.forEach(function(i){
    var myName = '小明';
    console.log(this.myName, i);
});

当我们在 VS Code 中,输入 forEach 时,

能看见提示中有写在 () 要插入一个 callbackfn

因为 forEach() 内的函式是属於 callback function,

而使用 callback function 是 Simple Call,

因此该函式中的 this 也是指向全域

接着我们来看 setTimeOut()

var myName = 'weiwei'

var family = {
    myName: '小明',
    callName: function(){
        setTimeout(function(){
            console.log(this.myName);
        }, 1000);
    }
};

family.callName();  // weiwei

虽然我们在 family 下执行,但 setTimeout 内的函式为 callback function,

因此这时的 this 也会指向全域,

此时我们不会看函式在哪里执行,而是看如何执行,

当像这种函式中要执行另一段函式时,但想要正确的取得外层的 小明 时,该怎麽做呢?

var myName = 'weiwei'

var family = {
    myName: '小明',
    callName: function(){
        var self = this;  // vm, that
        setTimeout(function(){
            console.log(self);
            console.log(self.myName);
        }, 1000);
    }
};

family.callName();

此时我们大多会在执行 this 函式的外层,

宣告变数来将 this 赋予到该变数中,

而该变数通常名称为 selfvmthat 根据开发者习惯而定,

随後在使用该变数取值,

在范例中,我们将 this 赋予到 self 中,

此时的 self 是指向物件本身,

因此使用 self.myName 会取得物件中的 小明

以上就是今天 Simple Call 的讲解,感谢观看!!


<<:  前谈依赖注入(Dependency Injection)

>>:  [Day 22] 谈 test double 的五种类型

[ 卡卡 DAY 12 ] - React Native UI 元件(component) 介绍(下)

再来多介绍一个常会用到的 list 元件 以及到目前的踩雷分享 :P 列表元件 Virtualiz...

2.4.12 Design System - Lists

不要什麽都说的艺术 想起之前一位在澳洲结交的台湾朋友 後来我们又在另一个国家重逢 我们有很多话可以...

30天打造品牌特色电商网站 Day.5 Figma快速上手

准备网页设计 今天来教大家更熟悉Figma! 首先先点击Frame(快捷键F),在右边会出现各个装置...

#5. Q&A Section(原生JS版)、#2. Blurring Loading(Vue版)、#3. Expanding Cards(Vue版)

今日任务 1. Q&A Section (原生JS写法) Codepen Link: htt...

勒瑰恩谈写作 (1) 文法与句子

开新地图了!之前花了 12 天把【如何衡量万事万物】读完,最後几天的摘要比较简略(汗) 接下来是【S...