javascript - js 匿名函数的形参改变影响的对象的属性?
迷茫
迷茫 2017-04-10 18:06:10
[JavaScript讨论组]

标题不知该如何表达(⊙﹏⊙)

数组莫名变这么多位

handleStrip1: function(strip,num) {
                var i = 0, self = this , len = strip.length;
                strip.push(self.duration)  //在这添加的
                if(!(len>0))return;
                for (i; i < len; i++) {
                    console.log("当前的sum = "+strip[i]);
                    if(strip[i]>num){
                        return +i;
                    }
                }
            }

handleStrip1函数(被setInterval方法每50毫秒调用),第一个参数strip传的的是这个对象的属性,匿名函数中的变量不是函数运行结束后就销毁了吗,为什么会影响到这个对象的属性呢?

function AA() {
   this.strip = data;
}
AA.prototype = {
   init : function() {
       var self = this;
       self.timer = setInterval(self.run.bind(self), 50);
   },
   run : function() {
       var self = this;
       self.curStrip = self.handleStrip1(self.strip,(self.Audio.currentTime).toFixed(2));
  }
};
迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(4)
PHPz

因为 strip 是按引用传递的,所以你一直在对同一个 strip 进行 push 操作。

怪我咯

不就是按照50ms调用一次去执行一个函数吗?
过了那么就的时间,当然很长了。

伊谢尔伦

你需要纠正下这个概念。
js 中的参数传递分为按值传递和引用传递。
你使用的引用传递,进行的操作肯定是会同步到外部的

高洛峰

又是万恶的闭包...是这样的,因为你在匿名函数里面使用了不在该作用域的属性,他首先在自己里面找,咦,没找到,接着向上找,这个时候找到了上一级的属性,此时二者是引用关系,至于为什么是引用,是因为其实这些属性是放在一个我们看不到的对象里面在的,官方名字我忘了~...所以此时你修改的时候会影响到外面的东西,并且因为你引用了,所以即使这个函数被销毁了,但是刚刚的那个对象还是存在引用关系,就是这样,喵~
如何解决:
var that = stripthat传进去试试

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号