同样的功能,我用ES6的arrow和传统的func写法,结果为何不同?

新手上路,请多包涵

我在学习vue的过程中,有一个动态过滤内容的demo,代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/vue.js"></script>
    <script src="js/vue-resource.min.js"></script>
    <style>
        p{
            width:100px;
            height:100px;
            background-color: red;
            margin:20px auto;
        }
    </style>
</head>
<body>
<div id="itany">
    <input type="text" v-model="name">

        <p v-for="(v,k) in arr2" :key="k" v-show="flag">
            {{v}}
        </p>

</div>
<script>
    var vm = new Vue({
        el:'#itany',
        data:{
            flag:true,
            arr:['tom', 'jack','mike','alice','alex','mark'],
            name:''
        },
        computed:{

            arr2:function () {
                var temp=[];
                this.arr.forEach(function (val) {
                    if(val.includes(this.name)){
                        temp.push(val);
                    }
                });
                return temp;
            }

//            arr2:function () {
//                var temp=[];
//                this.arr.forEach(val=> {
//                    if(val.includes(this.name)){
//                        console.log(val);
//                        temp.push(val);
//                    }
//                });
//                return temp;
//            }


        }
    })
</script>
</body>
</html>

我使用被注释掉的arr2就可以完成动态筛选,但是没有注释掉的arr2就不可以动态筛选。我想知道ES6的arrow和传统的function定义,在这里的区别是什么?

阅读 2.9k
5 个回答

箭头函数和普通函数最大的区别就是this指针的指向,箭头函数的this绑定外层作用域的this,在这里箭头函数的this指向vue示例,所以正常。而匿名函数的this指向window对象,所以this.name并不是你输入框输入的内容,而是window对象的name属性的值,所以不能正常筛选。你可以通过以下代码验证我的想法。

arr2:function () {
    var temp=[];
    this.arr.forEach(function (val) {
        console.log(this)  // 控制台可以看到this指向window
    });
    return temp;
}

this指针的指向是js中的一个难点,这里只是简单说了下。如果还有不懂的地方,欢迎交流

就是this的指向问题,es6 写法里的 this 才是指向vue实例,你可以console出来试试

https://jsfiddle.net/xuxiaofe...
上面是一个例子,你可以打开控制台跑一下看看,匿名函数内外this的区别
普通匿名函数的this指向window
而arrow函数中的this就是函数外部环境的this
所以你写在普通函数中的this.name始终为空,计算属性也就始终返回空数组

你在函数里面声明 var that = this, 让that暂时保存当前环境的作用域,然后that.name就可以了,具体原因,楼上已经给出答案了

箭头函数的this指向他的父函数。要理解这句话有几个关键点:
1.js函数调用栈。js的运行都是在函数调用栈中运行的,栈(先进后出),最底下是全局环境,然后根据代码执行时遇
到的函数,加载函数环境。
2.执行上下文。在被压入函数调用栈的时候会创建当前函数的执行上下文,执行上下文有创建和执行两个阶段。
创建阶段包括:创建作用域链、创建变量对象、确认this指向。
执行阶段包括:变量对象变成活动对象
当前函数执行完毕后销毁执行上下文。
3.箭头函数在生成执行上下文的时候没有确认this的指向,而是直接拿取函数调用栈上一层的执行环境的this对象

你这里的代码中,用了this.name,这里的两个this指向是不同的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题