当访问函数内的 foo 变量时,JavaScript 会按照下面顺序查找:
当前作用域内是否有 var foo 的定义。
函数形式参数是否有使用 foo 名称的。
函数自身是否叫做 foo。
回溯到上一级作用域,然后从 #1 重新开始。
在看Javascript 秘密花园的时候,发现一段晦涩难懂的代码片段,由于 中文版的没有讲到这个技巧的妙处,所以硬着头皮,看看英文版
Another trick is to use both
call
andapply
together to turn methods - functions that use the value of this as well as their arguments - into normal functions which only use their arguments.
(大概的意思是:可以一起使用call
和apply
将使用this
和参数的方法函数转化为使用相同参数的普通函数),
这不是在普通函数中利用call
和apply
,绑定传入的上下文吗?嗯...挺类似的,但是它两个一起使用,因为上下文是一个函数,需要再利用一次。
全部代码如下
function mutation(arr) {
//build a regexp
var regStr = "";
arr[1].split("").forEach(function(val){
regStr +="(?=.*?"+val.toLowerCase()+")";
//just like this "/(?=.*?a)(?=.*?b)(?=.*?c)/"
});
var regObj = new RegExp(regStr,"i");
return regObj.test(arr[0]);
从写程序的人来说,你描述的后半截是成立的,比如字符型、bool型、长度等信息表示元数据,而姓名(元数:字符型,6字节)、性别(元数:整型、1字节)是业务数据,这是从开发程序的角度。
但是前半截,也就是博主所说的意思,是从普(业)通(务)人的角度来看,如姓名、年龄、身高是元数据,而张三、男、170cm则是业务数据。
http://www.ruanyifeng.com/blog/2007/03/metadata.html#comment-353332
function bouncer(arr) {
arr = arr.filter(function(val){
//Boolean在这为转型函数而不是基本包装类
//当val为假值即false、null、0、""、undefined 和 NaN时,Boolean(val)为false
return Boolean(val);
});
return arr;
}