<script type="text/javascript">
var a=function(){
this.x=1
var parent = this
this.b=function(){
this.x=2
alert("parent.x "+parent.x)
}
}
var c=new a()
c.b()
递归经常碰到的问题了。出问题的地方是 Run(temp,path)
既然是递归的调用 而且这个函数本身 有 return 值 那么 你应该在
调用 Run(temp,path)的时候 接收他的返回值
应该写成 value = Run(temp,path)
1. 现在你可以设成 局部变量 var value 了。
之所以出现undefined就是因为
return value 这行代码 就执行了 1次 也就是 第一个执行 var test=Run(myjson,mypath)的时候
这个时候 value 变量还没有定义出来, value是在 最后一次执行 Run(temp,path)的时候才定义的,而需要把这个 返回出来 并接收 才有效。
2. json=json[path[0]],
这个地方 不会报错 你是写错了代码
你如果 把这个地方 写成 json=json[path[0]],
那么下面 Run(temp,path)是不是也应该写成 Run(json,path)呢?
这样就不会报错。
3. 在javascript里 数组和 对象 都是属于 引用类型的, 这是为了 节省内存空间。
其实道理简单, var a = {b:1} 这个时候 a变量里面 存储的是 保存这个 对象的内存地址,
打个比方 这个对象是一个宝箱 他是隐藏在内存的, a变量里面是打开这个宝箱的钥匙和地图
那么 b=a的时候 只是 复制了 钥匙和地图, 宝箱还是一个, 所以这个时候 a 和b 是指同一个对象的。
最后代码 修改后是这样
function Run(json,path){
if(path.length<=1){
var value=json[path[0]] // 如果这里换成var value=json[path[0]]结果是undefined
} else {
var temp
json=json[path[0]] //这里为什么不能用 json=json[path[0]]
path.splice(0,1)
value = Run(json,path)
//arguments.callee(temp,path)
}
return value
}
var myjson={a:1,b:{c:{e:3},d:4}}
var mypath=['b','c','e']
var test=Run(myjson,mypath)
alert(test)
var $=(function(){var b=/(?:[\w\-\\.#]+)+(?:\[\w+?=([\'"])?(?:\\\1|.)+?\1\])?|\*|>/ig,g=/^(?:[\w\-_]+)?\.([\w\-_]+)/,f=/^(?:[\w\-_]+)?#([\w\-_]+)/,j=/^([\w\*\-_]+)/,h=[null,null]function d(o,m){m=m||documentvar k=/^[\w\-_#]+$/.test(o)if(!k&&m.querySelectorAll){return c(m.querySelectorAll(o))}if(o.indexOf(",")>-1){var v=o.split(/,/g),t=[],s=0,r=v.lengthfor(s<r++s){t=t.concat(d(v[s],m))}return e(t)}var p=o.match(b),n=p.pop(),l=(n.match(f)||h)[1],u=!l&&(n.match(g)||h)[1],w=!l&&(n.match(j)||h)[1],qif(u&&!w&&m.getElementsByClassName){q=c(m.getElementsByClassName(u))}else{q=!l&&c(m.getElementsByTagName(w||"*"))if(u){q=i(q,"className",RegExp("(^|\\s)"+u+"(\\s|$)"))}if(l){var x=m.getElementById(l)return x?[x]:[]}}return p[0]&&q[0]?a(p,q):q}function c(o){try{return Array.prototype.slice.call(o)}catch(n){var l=[],m=0,k=o.lengthfor(m<k++m){l[m]=o[m]}return l}}function a(w,p,n){var q=w.pop()if(q===">"){return a(w,p,true)}var s=[],k=-1,l=(q.match(f)||h)[1],t=!l&&(q.match(g)||h)[1],v=!l&&(q.match(j)||h)[1],u=-1,m,x,ov=v&&v.toLowerCase()while((m=p[++u])){x=m.parentNodedo{o=!v||v==="*"||v===x.nodeName.toLowerCase()o=o&&(!l||x.id===l)o=o&&(!t||RegExp("(^|\\s)"+t+"(\\s|$)").test(x.className))if(n||o){break}}while((x=x.parentNode))if(o){s[++k]=m}}return w[0]&&s[0]?a(w,s):s}var e=(function(){var k=+new Date()var l=(function(){var m=1return function(p){var o=p[k],n=m++if(!o){p[k]=nreturn true}return false}})()return function(m){var s=m.length,n=[],q=-1,o=0,pfor(o<s++o){p=m[o]if(l(p)){n[++q]=p}}k+=1return n}})()function i(q,k,p){var m=-1,o,n=-1,l=[]while((o=q[++m])){if(p.test(o[k])){l[++n]=o}}return l}return d})()(此选择器为一外国人padolsey所写,名为mini)
支持以下获取方式:
//以标签获取元素
$("tag")
//以id获取元素
$("#id")
//以类名获取元素
$(".className")
//支持层级嵌套选取
$("tag >.className")
$("tag >tag")
$("#id >tag.className")
$("span >* >b")
//支持获取子孙元素
$(".className tag")
//支持同时并列选择器选取
$("tag, tag, #id")
$("tag#id.className")