Ts函数作为参数传递以及作用域问题总结

  1. 箭头函数作用域

   项目中调用方法时经常用到this,而this的指向也是极易改变的,所以对于一些复杂的函数,一般会先定义

const self = this;防止this发生改变。那么先说明一下比较常见的情况:

export class Service {

    func1() {

    }

    func2() {
        let arr = [1, 2, 3];
        arr.forEach(function (element) {
            this.func1();//这里有问题!!!this已经不指向全局对象了
        });

    }
}

当然常规操作,我们会这样做:

export class Service {

    func1() {

    }

    func2() {
        const self = this;//先把this缓存一下
        let arr = [1, 2, 3];
        arr.forEach(function (element) {
            self.func1();//这样就没有问题了!
        });

    }
}

当然这不是我想说的,如果改成这样可行吗(箭头函数)?

export class Service {

    func1() {

    }

    func2() {
        let arr = [1, 2, 3];
        arr.forEach(element => {
            this.func1();//这里虽然是this,但是没有问题,这是箭头函数和普通函数的区别!
        });

    }
}

这里虽然是this,但是没有问题,这是箭头函数和普通函数的区别!

箭头函数不会自动绑定局部变量,如this,arguments,super,箭头函数内的this值继承自外围作用域。在箭头函数中调用 this 时,仅仅是沿着作用域链向上寻找,找到最近的一个 this 来使用。

  1. 函数作为参数
export class Service {
    constructor() {
        this.func3(this.func2);//func2作为参数传入
    }
    func3(func) {
        func();//直接执行可能有问题!!!
    }

    func1() {

    }

    func2() {
        let arr = [1, 2, 3];
        arr.forEach(element => {
            this.func1();//这里可能会找不到this;this为undefined(ts语言编写)
        });

    }
}

这种调用类似于:

export class Service {
    constructor() {
        this.func3(this.func2);//func2作为参数传入
    }
    func3(func) {
        //  func和funcTest一样
        let funcTest = function () { 
            let arr = [1, 2, 3];
            arr.forEach(element => {
                this.func1();//这个this也是undefined,这个在块级作用于内
            });
         }
         funcTest();
        // func();//直接执行可能有问题!!!
    }

    func1() {

    }

    func2() {
        let arr = [1, 2, 3];
        arr.forEach(element => {
            this.func1();//这里可能会找不到this;this为undefined(ts语言编写)
        });

    }
}

解决办法很简单,可以使用call()来指定this:

export class Service {
    constructor() {
        this.func3(this.func2);//func2作为参数传入
    }
    func3(func) {
        func.call(this);//这个this是func3的父级作用域,
    }

    func1() {

    }

    func2() {
        let arr = [1, 2, 3];
        arr.forEach(element => {
            this.func1();//这里this就继承了上面call中的this。
        });
    }
}
  1. 按值和按引用传递问题
export class Service {
    num = 1;
    obj = {key:1};
    constructor() {
        this.func1(this.num);
        this.func2(this.obj);
        console.log(this.num);//还是1,并没有变成2
        console.log(this.obj["key"]);//这个变成了2
    }

    func1(Param) {
        Param = 2;
    }
    func2(Param) {
        Param['key'] = 2;
    }
}

但是有个坑!!!!:

export class Service {
    obj: any;//只声明,没有初始化,undefined
    constructor() {
        this.func2(this.obj);
        console.log(this.obj["key"]);//这里就会报错,因为obj是undefined!!!!
    }


    func2(Param) {
        if (Param === undefined) {
            Param = {};//在里面进行初始化
        }
        Param['key'] = 2;
    }
}

完!

Vue 3通过Composition API引入了新的作用域概念,即setup函数。在Vue 3中,我们可以在组件中使用setup函数来定义组件的逻辑,并且可以在其中使用响应式数据、计算属性、方法等。 作用域是指在组件中定义的变量和函数的可见范围。在Vue 3中,setup函数中定义的变量和函数只在当前组件的作用域内可见,不会污染全局作用域。这样可以提高代码的可维护性和可复用性。 使用TypeScript和Vite开发Vue 3应用时,可以通过以下步骤来设置作用域: 1. 在Vue组件中定义setup函数,它接收两个参数:props和context。 2. 在setup函数内部,可以使用props参数来接收父组件传递的数据,并将其定义为响应式数据。 3. 可以在setup函数内部定义其他变量和函数,并通过return语句将它们暴露给模板使用。 4. 在模板中可以直接使用setup函数中暴露的变量和函数。 例如,下面是一个使用Vue 3、TypeScript和Vite开发的简单示例: ```vue <template> <div> <p>{{ message }}</p> <button @click="increment">Increment</button> </div> </template> <script lang="ts"> import { defineComponent, ref } from 'vue'; export default defineComponent({ setup() { const message = ref('Hello, Vue 3'); const increment = () => { message.value += '!'; }; return { message, increment, }; }, }); </script> ``` 在上面的示例中,我们通过ref函数将message定义为响应式数据,并在setup函数中定义了increment函数。然后,我们将message和increment通过return语句暴露给模板使用。 这样,就可以在模板中使用message变量和increment函数,而它们的作用域仅限于当前组件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值