关于 js函数间传值:不同的js函数之间对象传值怎么调用啊.

最近各大互联网巨头的校招相继启动,看得我们这些准大四的码农想入非非。虽然早已经找到东家,但是毕竟阿里网易的名字对我们这些屁事不懂的应届生而言,还是极具吸引力的,所以这几天内心还是非常挣扎的,考虑再三,还是决定安心待在现在的公司,忍不住想夸自己忠如狗了!
也是在挣扎的那几天,去网上看了些前端笔试面试题,不由产生蛋蛋的忧伤。虽然已经实习了快5个月,做一些基础题还是会有很多问题,只能说基础不扎实呀。回想这实习的5个月,业务做得不少,熟练度直线提升,然而归纳总结寥寥无几。这让我又想起了,之前看到关于为什么写技术博客的原因。突然深深地体会到,不去花时间总结,平时业务上用到的零散知识点就很难形成体系,另外,仅仅只是在业务上碰到问题,查找解决方案,然后把问题解决了就带过,这样的学习方式是非常危险的。这是实习以来深深的痛点!
按照我现在的认识,现阶段做业务是必须的,遇到问题,查找解决方案,确定知识点,业余时间深入去学习该知识点,形成自己的理解。另外时不时去回顾下基础的书籍,从而形成自己的知识体系。所以,这周开始重新翻一遍js高程的基础。
基本类型、引用类型
闲扯完了,开始写今天要总结的基础知识。
基本类型: undefined、Null、Boolean、Number、String五种 (简单的数据段);
引用类型: object (由多个值构成)。
两种类型在使用上的区别:
这块好理解,看一个例子的对比就秒懂:
// 基本类型
var num1 = 5;
var num2 = num1;
num2 = 10;
console.log(num1 + ' | ' + num2); // 5 | 10
// 引用类型
var obj1 = new Object();
obj1.num = 5;
var obj2 = obj1;
obj2.num = 10;
console.log(obj1.num + ' | ' + obj2.num); // 10 | 10
一句话,引用类型复制的是指针的指向。
刚开始看书上,说的是“按值传递”。然后抛出一个例子:
function addTen(num) {
num += 10;
var count = 20;
var result = addTen(count);
console.log(count + ' | ' + result); // 20 | 30
看完这个例子,秒懂按值传递。紧接着又来一段代码:
function setName(obj) {
obj.name = 'aaa';
var person = new Object();
person.name = 'bbb';
var newPerson = setName(person);
console.log(person.name + ' | ' + newPerson.name); // aaa | aaa
看完这个例子,我就懵逼了。这段代码不是解释成按引用传递更合理吗?
然后又给了一个证明就算参数是引用类型也是按值传递的例子:
function setName(obj) {
obj.name = 'aaa';
var obj = new Object(); // 如果是按引用传递的,此处传参进来obj应该被重新引用新的内存单元
obj.name = 'ccc';
var person = new Object();
person.name = 'bbb';
var newPerson = setName(person);
console.log(person.name + ' | ' + newPerson.name); // aaa | ccc
从结果看,并没有显示两个'ccc'。这里是函数内部重写了obj,重写的obj是一个局部对象。当函数执行完后,立即被销毁。
到这里,js高程解释完了按值传递和按引用传递。然而对于我这样智商略平的同学而言,还是一脸懵逼。于是去网上深入地了解了下。
引用值:对象变量它里面的值是这个对象在堆内存中的内存地址。因此如果按引用传递,它传递的值也就是这个内存地址。那么var obj = new Object();会重新给obj分配一个地址,比如是0x321了,那么它就不在指向有name = 'aaa';属性的内存单元了。相当于把实参obj和形参obj的地址都改了,那么最终就是输出两个ccc了。
最后看个例子,弄懂了也就差不多理解了。
# 作者信息
num:'1'
num:'2'
function change(obj){
obj.num = '3';
return obj.
var result = change(a);
console.log(result + ' | ' + a.num); // 2 | 3
走一遍思路:
首先把a的值传到change函数内,obj.num = '3';后a.name被修改为3;
a的地址被换成b的地址;
返回此时的a中a.num。
按共享传递
在网上还看到一种叫 按共享传递 的说法,而且特别好理解。
大致概念是这样的:调用函数传参时,函数接受对象实参引用的副本(既不是按值传递的对象副本,也不是按引用传递的隐式引用)。 它和按引用传递的不同在于:在共享传递中对函数形参的赋值,不会影响实参的值。
可以回过头去看之前的例子,每个都符合用共享传递的概念去进行参数传递。关键是特别好理解,说的通俗点就是 先复制参数,然后把复制的这个放函数里面去折腾。
例子就不展开了,看官可以自己套几个demo。
对基本类型和引用类型的讨论主要在 函数参数的传递方式这块,希望对正在夯实js基础的你有所帮助。
阅读(...) 评论()基本数值类型不用说,传值;
引用类型:严格来说不能算传引用,在js中叫按共享传递 call by sharing也叫按对象传递、按对象共享传递。最早由Barbara Liskov. 在1974年的GLU语言中提出。该求值策略被用于Python、Java、Ruby、JS等多种语言。
该策略的重点是:调用函数传参时,函数接受对象实参引用的副本(既不是按值传递的对象副本,也不是按引用传递的隐式引用)。&
它和按引用传递的不同在于:在共享传递中对函数形参的赋值,不会影响实参的值。如下面例子中,不可以通过修改形参o的值,来修改obj的值。
var obj = {x : 1};
function foo(o) {
&&& o = 100;
console.log(obj.x); // 仍然是1, obj并未被修改为100.
然而,虽然引用是副本,引用的对象是相同的。它们共享相同的对象,所以修改形参对象的属性值,也会影响到实参的属性值。
var obj = {x : 1};
function foo(o) {
&&& o.x = 3;
console.log(obj.x); // 3, 被修改了!
js中的引用类型“”传引用“”实际是传共享,
即:地址的副本,所以在函数里面对地质的修改不会影响到外面,因为是地址的副本!
但是,又因为地址指向的是同一个内容,所以对“内容”即对象属性的修改会影响到外面。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:8251次
排名:千里之外
原创:26篇
(1)(2)(20)(8)2010年5月 Java大版内专家分月排行榜第一2010年2月 Java大版内专家分月排行榜第一2010年1月 Java大版内专家分月排行榜第一2010年1月 Oracle大版内专家分月排行榜第一2009年12月 Java大版内专家分月排行榜第一2009年12月 Oracle大版内专家分月排行榜第一
2010年2月 Oracle大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
function Dumplings(DOMselect){
this.ele=DOM
Dumplings.prototype.move=function(){
var _this=
var isdrag=
var tx,ty,x,y;
this.ele.addEventListener('touchstart',selectmouse);//如何调用selectmouse
console.log("move");
Dumplings.prototype.selectmouse=function(e){
console.log("move");
tx = parseInt(this.style.left+0);
ty = parseInt(this.style.top+0);
x = e.touches[0].pageX;
y = e.touches[0].pageY;
this.addEventListener('touchmove',movemouse);//如何调用movemouse方法?
this.addEventListener('touchend',function(){
this.removeEventListener('touchmove',movemouse); //如何调用movemouse方法?
Dumplings.prototype.movemouse=function(e){
if (isdrag){
var n = tx + e.touches[0].pageX -
var m = ty + e.touches[0].pageY -
if (n &= winW - 100) n = winW - 100;
if (n &= 0) n = 0;
if (m &= winH - 100) m = winH - 100;
if (m &= 0) m = 0;
this.style.left = n+"px";
this.style.top
上面的代码,如何调用prototype之间的函数,this已经改变。。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
对于 "touchstart" 可以直接把 this.selectmouse.bind(this) 作为事件处理函数。但是对于需要 remove 的 movemouse 就不能直接这样干了,每次 bind 都会产生新的函数对象,所以需要预先保留下来后面才能 remove。
Dumplings.prototype.selectmouse = function(e) {
console.log("move");
tx = parseInt(this.style.left + 0);
ty = parseInt(this.style.top + 0);
x = e.touches[0].pageX;
y = e.touches[0].pageY;
// ----------------------------
var _this =
// 把需要 remove 的事件函数预告保留下来
this._lastMoveEvent = this.movemouse.bind(this);
this.addEventListener("touchmove", this.movemouse.bind(this));
this.addEventListener("touchend", function() {
if (_this._lastMoveEvent) {
// remove 这个 listener,记得把 _lastMoveEvent 也清了
_this.removeEventListener("touchmove", _this._lastMoveEvent);
_this._lastMoveEvent =
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
谢邀。在原型里面直接用this
this.ele.addEventListener('touchmove', this.movemouse);
// 顺带一提,你后面有很多`this.addEventListener`等引用,肯定会报错的,你这儿应该是`this.ele.addEventListener`
然后你需要实例化
var dumplings = new Dumplings(document.body);
dumplings.move();
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
比如this.ele.addEventListener('touchstart', this.selectmouse.bind(this));
定义在Dumplings.prototype里的函数如果作为Dumplings实例的方法调用,其this指针会指向Dumpling实例。但作为参数传递给其他函数(比如addEventListener)时其this指针会被重置,由addEventListener控制。
你需要在prototype里的函数里调用其它同级的函数,this就应当指向Dumplings实例,用this.ele来绑定事件和访问事件的对象,这样才能通过this来访问其他同级对象。为防止addEventListener改变this的指向,需要用bind固定下来。
同步到新浪微博
分享到微博?
你好!看起来你挺喜欢这个内容,但是你还没有注册帐号。 当你创建了帐号,我们能准确地追踪你关注的问题,在有新答案或内容的时候收到网页和邮件通知。还能直接向作者咨询更多细节。如果上面的内容有帮助,记得点赞 (????)? 表示感谢。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:}

我要回帖

更多关于 js函数之间传值 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信