在这端代码执行的末尾,你会不会hi变量回事函数中的hi了?你会不会认为这不是按引用传递了? 对值传递和引用传递产生质疑了?
  
  1 var hi = {};
  
  2 function sayHello(hi) {
  
  // 这样来给hi赋值,声明的hi变量不会有任何变化,在函数外侧hi还是那个{}
  
  hi = {
  
  a: 'b'
  
  };
  
  console.log(yongshiyule178.com'in function hi : ' + hi.a);
  
  alert(hi.a);
  
  }
  
  sayHello(hi);
  
  console.log(www.mcyllpt.com 'out function: ' + hi.a); // 此时函数外的hi还是{}
  
  辨析:
  
  1 是实参hi
  
  2 是形参hi
  
  虽然名字同名但同名不是同一个变量,是两个不同的变量,虽然同名同名,但存放的内存位置不同。
  
  同名会迷惑你。
  
  实参hi是一个对象,在sayHello被调用时,会将引用赋值给形参hi,在函数内部我们将一个新对象赋值给形参hi,这时形参hi的引用发生了变化,指向了新的对象,但实参hi的引用并没有发生变化,所以函数调用后实参hi还是那个实参hi,这个函数值传递形式还是按引用传递,只不过我们在函数内部改变了形参hi的引用指向。如果不改变引用指向,可以在函数中修改实参hi的属性值。
  
  不要被表象所迷惑。
  
  这个问题是我在阅读seajs的源码发现的困惑,为什么这样写,在另一个模块中require是不能获取到暴露出的对象:
  
  seajsUtil.js
  
  define(function (require, exports, module) {
  
  exports = {
  
  a: 'meng',
  
  b: 'miao'
  
  };
  
  });
  
  seajsDemo.js
  
  define(function (require, exports, module) {
  
  var seaUtil = require(www.michenggw.com./seaUtil');
  
  console.log(seaUtil.a); // 报a未定义
  
  });
  
  理解了以上的困惑,就告诉我们正确的暴露对象的方法是:
  
  // 这样才是使用exports暴露变量和属性的正确姿势,exports本身是一个空对象{},要在空对象上进行添加属性和函数
  
  define(function (require, exports, module) {
  
  exports.a = 'meng';
  
  exports.b = 'miao';
  
  exports.sayHello = function(){
  
  alert('hi');
  
  }
  
  });
  
  // 直接return对象或者属性,这样就回避了exports属性暴露,使用return直接暴露,使用return可以暴露各种类型的值。
  
  // 是的适合,使用起来感觉比exports更便捷。暴露模块内容的方法可以是情况进行选择。
  
  define(function (require, exports, module) {
  
  return {a: 'meng', b: 'miao'};
  
  });
  
  //这是seajs的暴露模块属性的代码:
  
  /**
  
  * 如果构造函数factory不返回,则exports取mod.exports变量作为返回对象。也即是seajs模块的的交互,句柄持有的对
  
  * 象,要么是factory的return对象,要么是exports对外发布的对象。
  
  * factory被赋予的exports是一个对象,所以通过exports暴露的就是一个对象。
  
  */
  
  var exports = isFunction(factory) ?
  
  factory(require, mod.exports = {}, mod) :
  
  factory
  
  if (exports === undefined) {
  
  exports = mod.exports
  
  }
  
  // Reduce memory leak
  
  delete mod.factory
  
  mod.exports = exports
  
  mod.status = STATUS.EXECUTED
  
  // Emit `exec` event
  
  emit("exec", mod)
  
  return exports
  
  /**
  
  * require返回mod.exports,供其他模块接收使用.
  
  * require返回的exports变量,模块要给exports变量赋值
  
  */
  
  seajs.require = function (id) {
  
  var mod = Module.get(Module.resolve(id))
  
  if (mod.status < STATUS.EXECUTING) {
  
  mod.onload()
  
  mod.exec()
  
  }
  
  return mod.exports

JS容易理解错误的地方的更多相关文章

  1. myeclipse中导入js报如下错误Syntax error on token "Invalid Regular Expression Options", no accurate correc

    今天在使用bootstrap的时候引入的js文件出现错误Syntax error on token "Invalid Regular Expression Options", no ...

  2. 什么是core dump linux下用core和gdb查询出现"段错误"的地方

    什么是core dump   linux下用core和gdb查询出现"段错误"的地方 http://blog.chinaunix.net/uid-26833883-id-31932 ...

  3. linux下用core和gdb查询出现"段错误"的地方【转】

    转自:http://blog.chinaunix.net/uid-30091091-id-5754288.html 原文地址:linux下用core和gdb查询出现"段错误"的地方 ...

  4. hadoop数据容易出现错误的地方

    最近在搞关于数据分析的项目,做了一点总结. 下图是系统的数据流向.容易出现错误的地方.1.数据进入hadoop仓库有四种来源,这四种是最基本的数据,简称ods,original data source ...

  5. 【转】Eclipse去除js(JavaScript)验证错误

    这篇文章主要是对Eclipse去除js(JavaScript)验证错误进行了介绍.在Eclipse中,js文件常常会报错.可以通过如下几个步骤解决 第一步:去除eclipse的JS验证:将window ...

  6. vue自定义指令(Directive中的clickoutside.js)的理解

    阅读目录 vue自定义指令clickoutside.js的理解 回到顶部 vue自定义指令clickoutside.js的理解 vue自定义指令请看如下博客: vue自定义指令 一般在需要 DOM 操 ...

  7. js面向对象理解

    js面向对象理解 ECMAScript 有两种开发模式:1.函数式(过程化),2.面向对象(OOP).面向对象的语言有一个标志,那就是类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.但是, ...

  8. eclipse中jquery.js文件有错误提示…

    eclipse中jquery.js文件有错误提示的解决办法 2013-04-06 19:18 浏览次数:382 由于jquery.js文件进行了压缩,压缩之后的语法eclipse无法完全识别,所以有错 ...

  9. eclipse去除js(JavaScript)验证错误

    第一步: 去除eclipse的JS验证: 将windows->preference->Java Script->Validator->Errors/Warnings-> ...

随机推荐

  1. PHP 十问

    1.为了保证精度,Mysql中存钱数的字段用什么类型?PHP怎么处理浮点数精度 decimal数据类型来存储钱: 浮点数的精度有限.尽管取决于系统,PHP 通常使用 IEEE 754 双精度格式,则由 ...

  2. ctf题目writeup(7)

    2019.2.10 过年休息归来,继续做题. bugku的web题,地址:https://ctf.bugku.com/challenges 1. http://123.206.87.240:8002/ ...

  3. (数据科学学习手札15)DBSCAN密度聚类法原理简介&Python与R的实现

    DBSCAN算法是一种很典型的密度聚类法,它与K-means等只能对凸样本集进行聚类的算法不同,它也可以处理非凸集. 关于DBSCAN算法的原理,笔者觉得下面这篇写的甚是清楚练达,推荐大家阅读: ht ...

  4. 使用localStorage,sessionStorage,cookie等存储

    Web 存储 API 提供了 sessionStorage (会话存储) 和 localStorage(本地存储)两个存储对象来对网页的数据进行添加.删除.修改.查询操作. 特点: localStor ...

  5. Sqoop的安装配置及使用

    一.Sqoop基础:连接关系型数据库与Hadoop的桥梁 1.1 Sqoop的基本概念 Hadoop正成为企业用于大数据分析的最热门选择,但想将你的数据移植过去并不容易.Apache Sqoop正在加 ...

  6. 分支push不上去的问题

    还原一下现场,我在自己的项目里面,从master里面checkout的一个分支,当我在我这个分支里面进行 push代码的操作,我突然发现我的代码不能执行push的操作,如图 这个原因是由于远端的仓库没 ...

  7. EAS集锦

    前言 之前看过的相关BOS开发文档,整理了一些常用的API,一直没有来得及放上来,现在把整理的文件放上来,以备忘查看,分享.闲话少说,上干货! ps 图片不方便查看的话,可以拖住图片,加载到浏览器新页 ...

  8. exchange 2007迁移到2010

    标签:exchange 2007 2010 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://zpf666.blog.51cto.c ...

  9. abtest-system后台系统设计与搭建

    本文来自网易云社区 作者:刘颂 1 项目背景: 2017年5月:客户端提出增加https&dns以及双cdn业务功能 后台配合实现使用disconf配置 针对不同的域名或者请求配置不同的htt ...

  10. 30分钟玩转css3动画, transition,animation

    其实css3动画是就是2种实现,一种是transition,另一种就是animation.transition实现的话就是只能定制开始帧,和结束2帧:而animation实现的话可以写很多关键帧.没有 ...