4
注意:该方法的语法和作用与 apply() 方法类似,只有一个区别,就是 call() 方法接受的是一个参数列表,而 apply() 方法接受的是一个包含多个参数的数组。

先引用一句基本都会引用的句子,但本次并不是介绍两个方法的区别,而是尝试在vue中进行使用。
在vue中会有实例的this,通常在一个vue中我们会大量使用this,但如果我们把方法进行拆分成独立js后,能不能更简单方便的在独立js中使用this呢?

vue本身提供了一个mixins 方法,可以将独立出来的js混入到vue实例中,只要再vue中进行import 再声明mixins,就可以按照vue中的写法随心所欲的使用js了。
mixins参考vue官方api

也许我们还会有另一种不想混入的用法(仔细想想呢,其实大多数场景是可以用mixins包含的,只是复习javascript时又看到了call(),再进行一个深层的试想 ^__^)

call() 方法使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数。

一、应用在普通 js 中
下面看两个例子:

 1. 使用 let 声明变量,在function 中使用this
function foo() {
    setTimeout(() => {
      console.log('id:', this.id);
    }, 100);
  }

let id = 21;

foo.call({id:42});
foo.call(this);
foo();

// id: 42
// id: undefined
// id: undefined
2. 将变量id 绑定在全局上(也有例子是 window.id)
function foo() {
    setTimeout(() => {
      console.log('id:', this.id);
    }, 100);
  }

this.id = 21;

foo.call({id:42});
foo.call(this);
foo();

// id: 42
// id: 21
// id: undefined

目测js中可以通过call 进行this 传递。

二、应用在 vue 中

在vue 实例中的data 中定义了一个变量aaa,在created 中打印出来;同时调用t1中的方法。
test.vue

<template>
    <div>测试call</div>
</template>
<script>
    import t1 from './t1';
    export default {
        name: 'testThis',
        data() {
            return {
                aaa:'aaa'
            }
        },
        created() {
            t1.call(this);
            console.log(this.aaa);
        }
    }
</script>

在t1.js 中直接使用this
t1.js

export default function test() {
    console.log(this.aaa,'test');
}

clipboard.png
实践证明也是可以打印出来的。

所以我们在写一些独立js 文件,需要传递this 时,一定要清楚传的哪个this ,这样在写(ban)代(zhuan)码(tou)时就可以更灵活了。

附:MDN对call的介绍


cason6810
110 声望7 粉丝