当前位置 博文首页 > 黑夜中的天空:JavaScript函数
定义和用法:
continue 用于跳过循环中的一个迭代,并继续执行循环中的下一个迭代。
continue 与 break 语句的区别是:break 是结束整个循环体,continue是结束单次循环。
但是,在执行 continue 语句时,表现出了两种不同类型的循环:
在 while 循环中,会先判断条件,如果条件为 true,循环再执行一次。
在for循环中,自增长表达式(如:i++)会先计算,然后再判断条件是否为true,再决定是否执行迭代。
continue 语句可应用于可选的标签引用。
注意: continue 语句(不带标签引用),只能用在循环或 switch 中。
循环代码块,在 i 的值等于 "3" 时跳过当前循环:
定义和用法:
循环代码块,break在变量 i 为 "3" 时退出循环:
break 语句用于退出 switch 语句或循环语句(for, for ... in, while, do ... while)。
当 break 语句用于 switch 语句中时,会跳出 switch 代码块,终止执行代码。
当 break 语句用于循环语句时,会终止执行循环,并执行循环后代码(如果有的话)。
break 语句同样可用于可选的标签引用,用于跳出代码块。
注意: break 语句(不带标签引用),只能用在循环或 switch 中。
定义和用法:
arguments是函数里的 | 可以通过数组下标的形参访问函数实参值 |
arguments对象 | 没有表示参数集合,而是一个伪类数组 |
arguments对象是 | 所有(非箭头)函数中都可用的局部变量 |
此对象包含传递给函数的每个参数 | 第一个参数在索引0处。 |
你可以使用arguments对象在函数中引用函数的参数。 |
例如,如果一个函数传递了三个参数,你可以如下方式引用他们:
arguments[0]
arguments[1]
arguments[2]
求平均值:
function avg() { var num = 0, j = 0; for (let i = 0; i <= arguments.length; i++) { if (typeof arguments[i] != 'number') continue; num += arguments[i]; j++; } num /= 1; return num; } document.write(avg(1, 2, 3, 4));
它如果和callee属性一起使用的话,利用它可以设计函数迭代操作。使用arguments.callee可以获取匿名函数。最后比较实参和形参的
个数以检测用户传递的参数是否符合要求。如果不是匿名函数的话,则arguments.callee等价于函数名(f());
语法:
[function.]arguments.callee
可选项 function 参数是当前正在执行的 Function 对象的名称。
说明:
callee 属性的初始值就是正被执行的 Function 对象。
callee 属性是 arguments 对象的一个成员,是arguments的属性,该属性是一个指针,指向拥有arguments对象的函数,这有利于匿
名函数的递归或确保函数的封装性,例如下边示例的递归计算1到n的自然数之和。而该属性仅当相关函数正在执行时才可用。更有需要注意
的是callee拥有length属性,这个属性有时候用于验证还是比较好的。arguments.length是实参度,arguments.callee.length是形参长
度,由此能够判断调用时形参长度是否和实参长度一致。
function calleeDemo() { alert(arguments.callee); }
throw 语句允许我们创建自定义错误。正确的技术术语是:创建或抛出异常(exception)。
如果把 throw 与 try 和 catch 一起使用,那么您能够控制程序流,并生成自定义的错误消息。异常可以是 JavaScript 字符串、数字、
逻辑值或对象。
throw new Error('传递的参数不匹配');
search() 方法 | 用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串 |
search() 方法 | 执行正则表达式和 String 对象之间的一个搜索匹配 |
当你想要知道字符串中是否存在某个模式(pattern)时可使用 search(),类似于正则表达式的 test() 方法。当要了解更多匹配信息
时,可使用 match()(但会更慢一些),该方法类似于正则表达式的 exec() 方法。
语法:
stringObject.search(regexp)
参数 |
描述 |
regexp |
该参数可以是需要在 stringObject 中检索的子串,也可以是需要检索的 RegExp 对象。 注释:要执行忽略大小写的检索,请追加标志 i。 |
返回值
stringObject 中第一个与 regexp 相匹配的子串的起始位置。
注释:如果没有找到任何匹配的子串,则返回 -1。
说明:
search() 方法不执行全局匹配,它将忽略标志 g。它同时忽略 regexp 的 lastIndex 属性,并且总是从字符串的开始进行检索,这
意味着它总是返回 stringObject 的第一个匹配的位置。
特别说明:
字符串中字符的位置与数组类似,都是从0开始的。
searchValue不但可以是普通字符串,也可以是正则表达式,
function isEmail() { if (arguments.length > 1) { throw new Error('你只能传递一个参数'); } var regexp = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/; if (arguments[0].search(regexp) != -1) { return true; } else { return false; } } var email = '13021946513@qq.com'; if (isEmail(email)) { document.write(email); } else { document.write('请您重新输入邮箱地址'); }
获取函数的实参个数:使用arguments对象的length属性,仅能够在函数体内使用。
获取形参的个数使用函数名.length或者a.callee.length,function对象的length属性在函数体内外都可以使用.
function check(a) { if (a.length != a.callee.length) { throw new Error('参数不一致'); } }
function f(a, b, c, d) { check(arguments); return (a + b + c + d) } document.write(f(3, 4))
用户可以通过点语法为函数定义静态属性和方法。
函数属性可以在函数体内定义,只能在内部调用;函数属性也可以在函数体外定义,在外部调用。
函数方法可以在内部或外部定义,不管在内部或外部定义都可以调用此函数方法。
用户不妨为函数定义属性,然后利用函数属性实现函数每次返回低增值。
function f() { return f.x++; } f.x = 0; for (var i = 0; i < 10; i++) { document.write(f()); }
call()和apply()是function对象的原型方法。把一个函数当做一个方法绑定到指定对象上并进行调用。
具体用法如下:
function.call(thisobj,args...)
function.apply(thisobj,args)
其中参数thisobj表示指定的对象,参数args表示要传递给被调用函数的参数。而call()方法只能接受多个参数列表,apply()只能接受一个数组
或伪数组,数组元素将作为参数传递给被调用的函数。
代码如下:
function f(x, y) { return x + y; } function o(a, b) { return a * b; } document.write(f.call(o, 3, 4));
使用call()和apply()方法可以把一个函数转换为指定对象的方法,并在这个对象上临时绑定调用该方法。
提示:它们能够动态改变函数内this指代的对象,这在面向对象编程中是非常有用的。
call()和apply()传递给参数的方式不同,
apply()是以数组形式传递参数,
call()方法以多个值的形式传递参数。
代码如下:
function r(x) { return (x); } function f(x) { x[0] = x[0] + '>'; return x; }
function o() { var temp = r; r = function () { return temp.apply(this, f(arguments)); } }
function a() { o(); document.write(r('=')); } for (var i = 0; i < 10; i++) { a(); }
函数function增加了一个原型方法bind(),是指用来把函数绑定到指定对象上。
具体用法如下:
function.bind(thisArg[,arg1[,arg2[,argN]);
参数说明如下:
function |
必须参数,一个函数对象 |
thisArg |
必须参数,this关键字可在新函数中引用的对象 |
arg1[,arg2[,argN]] |
可选参数,要传递到新函数的参数的列表。 |
bind方法将返回与函数相同的新函数不会立即执行,等需要的时候才会执行该新函数。bind()方法也可以多个或两个传递参数值。
var displayArgs = function (val1, val2, val3, val4) { document.write(val1 + '<br> ' + val2 + ' <br>' + val3 + '<br> ' + val4 + '<br> '); }
var emptyObject = {}; var displayArg2 = displayArgs.bind(emptyObject, '姓名:' + '张亮', '年龄:' + 25 + '岁'); displayArg2('身高:' + 180 + 'cm', '民族:' + ' ' + '汉族');
语法:
string.trim()
定义和用法:
trim() |
方法用于删除字符串的头尾空格。 |
trim() |
方法不会改变原始字符串。 |
实例:
去除字符串的头尾空格:
function myTrim(x) { return x.replace(/^\s+|\s+$/gm,''); }
function myFunction() { var str = myTrim(" Runoob "); alert(str); }
this的定义:
this是函数体内自带的一个对象指针,this指向当前调用函数的那个对象,或者指向类的当前实例。
this的特点:
在function内部被创建
指向调用时所在函数所绑定的对象(拗口)
this 不能被赋值,但可以被 call/apply 改变
this的用途:这里把它所有用到的地方列出
function Tab(nav, content) { this.nav = nav this.content = content } Tab.prototype.getNav = function() { return this.nav; };
2. this 和对象
var tab = { nav: '', content: '', getNav: function() { return this.nav; }, setNav: function(n) { this.nav = n; } }
3. this 和函数
function showMsg() { alert(this.message) } var m1 = { message: '输入的电话号码不正确' } var m2 = { message: '输入的身份证号不正确' } showMsg.call(m1) // '输入的电话号码不正确' showMsg.call(m2) // '输入的身份证号不正确'
4. 全局环境的 this
var x = 10; function func() { alert(this.x) } var obj = { x: 20, fn: function() { alert(this.x) } } var fn = obj.fn func() // 10 fn() // 10
没错,最终输出的都是全局的10。永远记住这一点:判断 this 指向谁,看执行时而非定义时,只要函数(function)没有绑定在对象上调用,它的
this就是window。
5. this 和 DOM/事件
<div id="nav" onclick="getId()">ddd</div>
<script>
function getId() { alert(this.id) }
</script>
点击 div 后,为什么 id 是 undefined,不说是指向的当前元素 div 吗?如果记住了前面提到的一句话,就很清楚为啥是 undefined,把这句话再贴出来。判断 this 指向谁,看执行时而非定义时,只要函数(function)没有绑定在对象上调用,它的 this 就是 window。
这里函数getId调用时没有绑定在任何对象上,可以理解成这种结构:
div.onclick = function() { getId() }
getId 所处匿名函数里的 this 是 div,但 getId 自身内的 this 则不是了。当然 ES5 严格模式下还是有个坑。
6. this 可以被 call/apply/bind 改变
var m1 = { message: 'This is A' } var m2 = { message: 'This is B' } function showMsg() { alert(this.message) } showMsg() // undefined showMsg.call(m1) // 'This is A' showMsg.call(m2) // 'This is B'
7. me/self/that/_this 暂存 this
如果采用 OOP 方式写 JS 代码,无可避免的会用到 this,方法内会访问类的内部属性(字段),也可能会调用类的另一个方法。当类的方法内又有一个 function 时,比如浏览器端开发经常遇见的给 DOM 元素添加事件,这时如果事件处理器(handler)中的想调用类的一个方法,此时 handler 内的 this 是 dom 元素而非类的当前对象。这个时候,需要把 this 暂存,开发者发挥着自己的聪明才智留下了几种经典的命名 me, self, that, _this。
如:一般会在每个方法的第一句就把 this 暂存下来。
8. ES5 中新增的 bind 和 this
var modal = { message: 'This is A' } function showMsg() { alert(this.message) } var otherShowMsg = showMsg.bind(modal) otherShowMsg() // 'This is A'