Java Script 读书笔记 (三) 函数
1. 函数作用域
在函数内部定义的变量,外部无法读取,称为“局部变量”(local variable)。
变量v
在函数内部定义,所以是一个局部变量,函数之外就无法读取。
函数内部定义的变量,会在该作用域内覆盖同名全局变量。
var v=1;
function f(){
var v=2;
console.log(v);
} f() //
v //
注意,对于var
命令来说,局部变量只能在函数内部声明,在其他区块中声明,一律都是全局变量。
if (true){
var x=5;
}
console.log(x); //
上面代码中,变量x
在条件判断区块之中声明,结果就是一个全局变量,可以在区块之外读取。
2. 函数内部的变量提升
与全局作用域一样,函数作用域内部也会产生“变量提升”现象。var
命令声明的变量,不管在什么位置,变量声明都会被提升到函数体的 头部。
function foo(x){
if (x>100){
var tmp = x -100;
}
} //上面的代码等同于 function foo(x){
var tmp;
if (x>100){
tmp -x -100;
};
}
3. 函数本身的作用域
函数本身也是一个值,也有自己的作用域。它的作用域与变量一样,就是其声明时所在的作用域,与其运行时所在的作用域无关。
var a=1;
var x =function(){
console.log(a);
}; function f(){
var a=2;
x();
}
f() //
上面的代码中, 函数x是在函数f的外部声明的,所以它的作用域绑定外层,内部变量a不会到函数f体内取值,所以输出1,而不是2.
4. 默认值
通过下面的方法, 可以为函数的参数设置默认值。
function f(a){
a=a||1;
return a;
} f("") //
f(0) //
上面代码的||表示 “或运算”,即如果a有值,则返回a, 否则返回事先设定的默认值。
这种写法会对a进行一次布尔运算, 只有为true时,才会返回a. 可是, 除了undefined以外,0、空字符、null等的布尔值也是false.也就是说,在上面的函数中,不能让a等于0或者空字符串, 否则在明明有参数的情况下,也会返回默认值 。为了避免这个问题, 可以采用下面更精确的写法.
function f(a){
(a!== undefined && a!==null)? a=a:a=1;
return a;
} f() //
f("") // ""
f(0) //
5. 传递方式
传值传递 (passes by value): 函数参数是原始类型的值(Int,String,Boolean...), 在函数体内修改参数值,不会影响到函数外部。
传址传递 (pass by reference) : 函数参数是复合类型的值(数组,对象,其他函数),在函数内部修改参数,将会影响到原始值。
var obj={p:1};
function f(0){
o.p=2;
|
f(obj);
obj.p //
上面代码中, 传入函数f的是参数对象obj的地址,因此,在函数内部修改obj的属性p,会影响到原始值。
注意,如果函数内部修改的,不是参数对象的某个属性, 而是替换掉整个参数,这时不会影响到原始值,例:
var obj=[1,2,3];
function f(0){
o=[2,3.4];
}
f(obj); obj //[1,2,3]
上面代码中, 在函数f内部,参数对象obj被整个替换成另一个值,这时不会影响到原始值,因为形式参数(o)与实际参数obj存在一个赋值关系。
如果需要对某个原始类型的变量, 获取传址传递的效果,可以将它写成全局对象的属性:
var a=1;
function f(p){
window[p] =2;
}
f("a"); a//
上面代码中, 变量a本来是传值传递,但是写成window对象的属性,就达到了传址传递的效果。
6. 同名参数
如果有同名的参数,则取最后出现的那个值。例:
function f(a,a){
console.log(a);
}
f(1,2) //
即使后面的a没有值或被省略,也是以其为准.
function f(a,a){
console.log(a);
}
f(1) // undefined
调用函数f的时候,如果没有提供第二个参数,a的取值就变成了undefined.这时, 如果要获得第一个a的值,可以使用arguments对象。
function f(a,a){
console.log(arguments[0]);
}
f(1) //
Java Script 读书笔记 (三) 函数的更多相关文章
- Java Script 读书笔记 (四) 面向对象编程
1. 对象,属性 前面看到对象里删除属性一直疑惑,什么是对象,为什么属性可以删除, 我印象里的属性还是停留在property, 总想不明白为什么属性竟然能够删除.直到看到标准库才明白,原来对象就是py ...
- 《Effective Java》读书笔记三(类和接口)
No13 使类和成员的可访问性最小化 要区别设计良好的模块与设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和其他实现细节.模块之间只通过它们的API进行通信,一个 ...
- Java泛型读书笔记 (三)
泛型对于老代码的支持 Java的泛型设计成类型擦除的目的,很大一部分是为了兼容老老代码.如下的一段代码: void setLabelTable(Dictionary table) table的类型是非 ...
- java effective 读书笔记
java effective 读书笔记 []创建和销毁对象 静态工厂方法 就是“封装了底层 暴露出一个访问接口 ” 门面模式 多参数时 用构建器,就是用个内部类 再让内部类提供构造好的对象 枚举 si ...
- 深入理解Java虚拟机 -- 读书笔记(1):JVM运行时数据区域
深入理解Java虚拟机 -- 读书笔记:JVM运行时数据区域 本文转载:http://blog.csdn.net/jubincn/article/details/8607790 本系列为<深入理 ...
- Java IO学习笔记三:MMAP与RandomAccessFile
作者:Grey 原文地址:Java IO学习笔记三:MMAP与RandomAccessFile 关于RandomAccessFile 相较于前面提到的BufferedReader/Writer和Fil ...
- Java IO学习笔记三
Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...
- 【转载】MDX Step by Step 读书笔记(三) - Understanding Tuples (理解元组)
1. 在 Analysis Service 分析服务中,Cube (多维数据集) 是以一个多维数据空间来呈现的.在Cube 中,每一个纬度的属性层次结构都形成了一个轴.沿着这个轴,在属性层次结构上的每 ...
- Java并发读书笔记:线程安全与互斥同步
目录 导致线程不安全的原因 什么是线程安全 不可变 绝对线程安全 相对线程安全 线程兼容 线程对立 互斥同步实现线程安全 synchronized内置锁 锁即对象 是否要释放锁 实现原理 啥是重进入? ...
随机推荐
- DB Query Analyzer has been downloaded more than 100,000 times
DB Query Analyzer has been downloaded more than 100,000 times Today I am very ...
- javascript访问html元素的内容(1)
形如如下格式的html元素: <p id="my_p">I'm <strong>BIG</strong> panda!!!</p> ...
- 抛开rails使用ActiveRecord连接数据库
今天是大年三十,明天就正式进入羊年鸟,给所有程序猿(媛)同人拜个年吧!祝大家身体健康,事业有成,财源广进哦! 话归正题,以前都是在rails中使用数据库,或者在rails的console中使用:我们如 ...
- ZeroMQ 教程 001 : 基本概览
介绍性的话我这里就不翻译了, 总结起来就是zmq很cool, 你应该尝试一下. 如何安装与使用zmq 在Linux和Mac OS上, 请通过随机附带的包管理软件, 或者home brew安装zmq. ...
- sort list(给链表排序)
Sort a linked list in O(n log n) time using constant space complexity. 题目要求使用O(nlogn)时间复杂度,可以考虑使用归并排 ...
- 7. Selenium的基本使用
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 32.0px "PingFang SC" } span.s1 { font: 32.0p ...
- Java 故障安全异常处理
异常处理代码必须保证其故障安全机制,其中一条重要的规则如下: 在try-catch-finally块抛出的最后一个异常将会在调用堆栈中传递. 所有早期异常将会消失. 如果从一个catch或finall ...
- jsoup 使用总结2--高级用法之 :gt(n)
jsoup 使用总结2--高级用法之 :gt(n) 大部分时候,我们使用jsoup解析网页的时候,都是直接找到某一类元素,或者按某种selector查询:具体使用方法可以参考jsoup官网文档 部分h ...
- Redis案例——商品秒杀,购物车
秒杀案例: <?php header("content-type:text/html;charset=utf-8"); $redis = new redis(); $resu ...
- BOM,DOM常见操作和DHML
BOM (Browser Object Model)浏览器对象模型,控制浏览器的一些行为 window对象 代表一个HTML文档 属性 页面导航的5个属性 self, parent, top, ope ...